Docker
Uruchamianie kontenerów
Szukaj…
Składnia
- Uruchom okno dokowane [OPCJE] OBRAZ [POLECENIE] [ARG ...]
Uruchamianie kontenera
docker run hello-world
Spowoduje to pobranie najnowszego obrazu hello-world z Docker Hub (jeśli jeszcze go nie masz), utworzenie nowego kontenera i uruchomienie go. Powinien zostać wyświetlony komunikat informujący, że instalacja działa poprawnie.
Uruchomienie innego polecenia w kontenerze
docker run docker/whalesay cowsay 'Hello, StackExchange!'
To polecenie nakazuje Dockerowi utworzyć kontener z obrazu docker/whalesay
i uruchomić polecenie cowsay 'Hello, StackExchange!'
w tym. Powinien wydrukować zdjęcie wieloryba z napisem Hello, StackExchange!
do twojego terminala.
Jeśli punkt wejścia na obrazie jest domyślny, możesz uruchomić dowolne polecenie dostępne na obrazie:
docker run docker/whalesay ls /
Jeśli został zmieniony podczas kompilacji obrazu, musisz przywrócić go do wartości domyślnej
docker run --entrypoint=/bin/bash docker/whalesay -c ls /
Automatycznie usuń kontener po uruchomieniu
Zwykle kontener Docker utrzymuje się po jego wyjściu. Umożliwia to ponowne uruchomienie kontenera, sprawdzenie jego systemu plików i tak dalej. Czasami jednak chcesz uruchomić kontener i usunąć go natychmiast po wyjściu. Na przykład, aby wykonać polecenie lub wyświetlić plik z systemu plików. Docker udostępnia w tym celu opcję wiersza polecenia --rm
:
docker run --rm ubuntu cat /etc/hosts
Spowoduje to utworzenie kontenera z obrazu „ubuntu”, wyświetlenie zawartości pliku / etc / hosts , a następnie usunięcie kontenera natychmiast po jego wyjściu. Pomaga to uniknąć konieczności czyszczenia pojemników po zakończeniu eksperymentów.
Uwaga: Flaga
--rm
nie działa w połączeniu z flagą-d
(--detach
) w oknie dokowanym <1.13.0.
Gdy --rm
jest --rm
, Docker usuwa również woluminy powiązane z kontenerem, gdy kontener jest usuwany. Jest to podobne do uruchamiania docker rm -v my-container
. Usuwane są tylko woluminy określone bez nazwy .
Na przykład, w docker run -it --rm -v /etc -v logs:/var/log centos /bin/produce_some_logs
, wolumin /etc
zostanie usunięty, ale wolumin /var/log
nie. Woluminy odziedziczone przez --volumes-from zostaną usunięte z tą samą logiką - jeśli oryginalny wolumin został określony nazwą, nie zostanie usunięty.
Określanie nazwy
Domyślnie pojemniki utworzone z docker run
podano losową nazwę jak small_roentgen
lub modest_dubinsky
. Te nazwy nie są szczególnie pomocne w określeniu przeznaczenia kontenera. Można podać nazwę kontenera, przekazując opcję wiersza polecenia --name
:
docker run --name my-ubuntu ubuntu:14.04
Nazwy muszą być unikalne; jeśli podasz nazwę, której używa już inny kontener, Docker wydrukuje błąd i nie zostanie utworzony żaden nowy kontener.
Podanie nazwy będzie przydatne podczas odwoływania się do kontenera w sieci Docker. Działa to zarówno dla kontenerów Docker w tle, jak i na pierwszym planie.
Kontenery w domyślnej sieci mostowej muszą być połączone, aby komunikować się według nazwy.
Wiązanie portu kontenera z hostem
docker run -p "8080:8080" myApp
docker run -p "192.168.1.12:80:80" nginx
docker run -P myApp
Aby móc korzystać z portów gospodarza zostały wystawione na obrazie (przez EXPOSE
dyrektywy Dockerfile lub --expose
opcja linii polecenia dla docker run
), te otwory muszą być związane z gospodarzy z zastosowaniem -p
lub -P
polecenie opcje linii. Użycie -p
wymaga podania określonego portu (i opcjonalnego interfejsu hosta). Użycie opcji wiersza polecenia -P
wielkimi literami zmusi Docker do powiązania wszystkich odsłoniętych portów obrazu kontenera z hostem.
Zasady restartowania kontenera (uruchamianie kontenera podczas uruchamiania)
docker run --restart=always -d <container>
Domyślnie Docker nie uruchomi ponownie kontenerów po ponownym uruchomieniu demona Docker, na przykład po ponownym uruchomieniu systemu hosta. Docker zapewnia zasady ponownego uruchamiania kontenerów, podając opcję wiersza polecenia --restart
. --restart=always
zawsze spowoduje ponowne uruchomienie kontenera po ponownym uruchomieniu demona Docker. Jednak gdy ten kontener zostanie ręcznie zatrzymany (np. Z docker stop <container>
), zasady restartu nie zostaną zastosowane do kontenera.
Dla opcji --restart
można określić --restart
opcji w zależności od wymagań ( --restart=[policy]
). Te opcje wpływają również na sposób uruchamiania kontenera podczas rozruchu.
Polityka | Wynik |
---|---|
Nie | Wartość domyślna . Nie zrestartuje automatycznie pojemnika, gdy pojemnik zostanie zatrzymany. |
w przypadku awarii [: maksymalna liczba prób] | Zrestartuj tylko wtedy, gdy kontener zakończy się niepowodzeniem ( non-zero exit status ). Aby uniknąć ponownego uruchamiania go w nieskończoność (w przypadku jakiegoś problemu), można ograniczyć liczbę ponownych prób uruchomienia przez demona Docker. |
zawsze | Zawsze uruchamiaj ponownie kontener bez względu na status wyjścia. Jeśli always wybierzesz opcję, demon Docker będzie próbował ponownie uruchomić kontener bez końca. Kontener będzie również zawsze uruchamiany podczas uruchamiania demona, niezależnie od bieżącego stanu kontenera. |
chyba że zatrzymany | Zawsze uruchamiaj ponownie kontener bez względu na jego status wyjścia, ale nie uruchamiaj go przy uruchomieniu demona, jeśli wcześniej kontener był w stanie zatrzymania. |
Uruchom kontener w tle
Aby kontener działał w tle, podczas uruchamiania kontenera podaj opcję -d
:
docker run -d busybox top
Opcja -d
uruchamia kontener w trybie odłączonym. Jest to również równoważne z -d=true
.
Kontenera w trybie odłączonym nie można automatycznie usunąć po zatrzymaniu, co oznacza, że nie można użyć opcji --rm w połączeniu z opcją -d.
Przypisz wolumin do kontenera
Wolumin Docker to plik lub katalog, który utrzymuje się przez cały okres istnienia kontenera. Możliwe jest zamontowanie pliku lub katalogu hosta jako woluminu w kontenerze (z pominięciem UnionFS).
Dodaj wolumin z -v
wiersza polecenia -v
:
docker run -d -v "/data" awesome/app bootstrap.sh
Spowoduje to utworzenie woluminu i zamontowanie go na ścieżce /data
w kontenerze.
- Uwaga: Możesz użyć flagi
--rm
aby automatycznie usunąć wolumin po usunięciu kontenera.
Montowanie katalogów hosta
Aby zamontować plik hosta lub katalog w kontenerze:
docker run -d -v "/home/foo/data:/data" awesome/app bootstrap.sh
- Podczas określania katalogu hosta należy podać bezwzględną ścieżkę.
Spowoduje to zamontowanie katalogu hosta /home/foo/data
na /data
wewnątrz kontenera. Ten wolumin „katalogu hosta mount --bind
wiązania” jest tym samym, co mount --bind
do systemu Linux - mount --bind
dlatego tymczasowo montuje katalog hosta na określonej ścieżce kontenera na czas życia kontenera. Zmiany w woluminie z hosta lub kontenera są natychmiast odzwierciedlane w drugim, ponieważ są tym samym miejscem docelowym na dysku.
Przykład UNIX-a instalowania folderu względnego
docker run -d -v $(pwd)/data:/data awesome/app bootstrap.sh
Nazwy woluminów
Wolumin można nazwać, podając ciąg zamiast ścieżki katalogu hosta, doker utworzy wolumin o tej nazwie.
docker run -d -v "my-volume:/data" awesome/app bootstrap.sh
Po utworzeniu nazwanego woluminu można go następnie udostępnić innym kontenerom o tej nazwie.
Ustawianie zmiennych środowiskowych
$ docker run -e "ENV_VAR=foo" ubuntu /bin/bash
Zarówno -e
jak i --env
mogą być użyte do zdefiniowania zmiennych środowiskowych w kontenerze. Możliwe jest podanie wielu zmiennych środowiskowych za pomocą pliku tekstowego:
$ docker run --env-file ./env.list ubuntu /bin/bash
Przykładowy plik zmiennych środowiskowych:
# This is a comment
TEST_HOST=10.10.0.127
Flaga --env-file
przyjmuje nazwę pliku jako argument i oczekuje, że każda linia ma format VARIABLE=VALUE
, naśladując argument przekazany do --env
. Wiersze komentarza muszą być poprzedzone tylko #
.
Niezależnie od kolejności tych trzech flag najpierw przetwarzane są --env-file
, a następnie flagi -e
/ --env
. W ten sposób wszelkie zmienne środowiskowe dostarczone indywidualnie z -e
lub --env
zmienne --env-var
pliku tekstowym --env-var
.
Określanie nazwy hosta
Domyślnie kontenery utworzone za pomocą okna dokowanego otrzymują losową nazwę hosta. Możesz nadać kontenerowi inną nazwę hosta, przekazując flagę --hostname:
docker run --hostname redbox -d ubuntu:14.04
Uruchom kontener interaktywnie
Aby uruchomić kontener interaktywnie, przekaż opcje -it
:
$ docker run -it ubuntu:14.04 bash
root@8ef2356d919a:/# echo hi
hi
root@8ef2356d919a:/#
-i
utrzymuje STDIN otwarty, a -t
przydziela pseudo-TTY.
Działający kontener z limitami pamięci / zamiany
Ustaw limit pamięci i wyłącz limit wymiany
docker run -it -m 300M --memory-swap -1 ubuntu:14.04 /bin/bash
Ustaw limit pamięci i wymiany. W takim przypadku kontener może używać pamięci 300 mln i wymiany 700 mln.
docker run -it -m 300M --memory-swap 1G ubuntu:14.04 /bin/bash
Przenoszenie powłoki do działającego (odłączonego) kontenera
Zaloguj się do działającego kontenera
Użytkownik może wprowadzić działający kontener w nowej interaktywnej powłoce bash za pomocą polecenia exec
.
Załóżmy, że kontener nazywa się jovial_morse
a następnie możesz uzyskać interaktywną powłokę pseudo-TTY, uruchamiając:
docker exec -it jovial_morse bash
Zaloguj się do działającego kontenera z określonym użytkownikiem
Jeśli chcesz wprowadzić kontener jako określony użytkownik, możesz ustawić go za --user
parametru -u
lub --user
. Nazwa użytkownika musi istnieć w kontenerze.
-u, --user
Nazwa użytkownika lub UID (format:<name|uid>[:<group|gid>]
)
To polecenie zaloguje się do jovial_morse
z użytkownikiem dockeruser
docker exec -it -u dockeruser jovial_morse bash
Zaloguj się do działającego kontenera jako root
Jeśli chcesz zalogować się jako root, po prostu użyj parametru -u root
. Użytkownik root zawsze istnieje.
docker exec -it -u root jovial_morse bash
Zaloguj się do obrazu
Możesz również zalogować się do obrazu za pomocą polecenia run
, ale wymaga to nazwy obrazu zamiast nazwy kontenera.
docker run -it dockerimage bash
Zaloguj się do obrazu pośredniego (debugowanie)
Możesz także zalogować się do obrazu pośredniego, który jest tworzony podczas kompilacji pliku Dockerfile.
Dane wyjściowe docker build .
$ docker build .
Uploading context 10240 bytes
Step 1 : FROM busybox
Pulling repository busybox
---> e9aa60c60128MB/2.284 MB (100%) endpoint: https://cdn-registry-1.docker.io/v1/
Step 2 : RUN ls -lh /
---> Running in 9c9e81692ae9
total 24
drwxr-xr-x 2 root root 4.0K Mar 12 2013 bin
drwxr-xr-x 5 root root 4.0K Oct 19 00:19 dev
drwxr-xr-x 2 root root 4.0K Oct 19 00:19 etc
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 lib
lrwxrwxrwx 1 root root 3 Mar 12 2013 lib64 -> lib
dr-xr-xr-x 116 root root 0 Nov 15 23:34 proc
lrwxrwxrwx 1 root root 3 Mar 12 2013 sbin -> bin
dr-xr-xr-x 13 root root 0 Nov 15 23:34 sys
drwxr-xr-x 2 root root 4.0K Mar 12 2013 tmp
drwxr-xr-x 2 root root 4.0K Nov 15 23:34 usr
---> b35f4035db3f
Step 3 : CMD echo Hello world
---> Running in 02071fceb21b
---> f52f38b7823e
Zwróć uwagę na ---> Running in 02071fceb21b
wyjściu ---> Running in 02071fceb21b
, możesz zalogować się do tych obrazów:
docker run -it 02071fceb21b bash
Podanie standardowego wejścia do pojemnika
W przypadkach takich jak przywracanie zrzutu bazy danych lub w inny sposób, gdy chcesz przepchnąć niektóre informacje przez potok z hosta, możesz użyć flagi -i
jako argumentu do docker run
docker exec
lub wykonania docker exec
.
Na przykład, zakładając, że chcesz umieścić w konteneryzowanym kliencie mariadb zrzut pamięci bazy danych na hoście, w lokalnym pliku dump.sql
, możesz wykonać następujące polecenie:
docker exec -i mariadb bash -c 'mariadb "-p$MARIADB_PASSWORD" ' < dump.sql
Ogólnie,
docker exec -i container command < file.stdin
Lub
docker exec -i container command <<EOF
inline-document-from-host-shell-HEREDOC-syntax
EOF
Odłączanie od pojemnika
Po podłączeniu do działającego kontenera z przypisanym pty ( docker run -it ...
), możesz nacisnąć Control P - Control Q, aby odłączyć.
Przesłanianie dyrektywy punktu wejścia obrazu
docker run --name="test-app" --entrypoint="/bin/bash" example-app
To polecenie zastąpi dyrektywę ENTRYPOINT
obrazu example-app
podczas tworzenia test-app
kontenera. Dyrektywa CMD
obrazu pozostanie niezmieniona, chyba że określono inaczej:
docker run --name="test-app" --entrypoint="/bin/bash" example-app /app/test.sh
W powyższym przykładzie zarówno ENTRYPOINT
, jak i CMD
obrazu zostały zastąpione. Ten proces kontenerowy staje się /bin/bash /app/test.sh
.
Dodaj pozycję hosta do kontenera
docker run --add-host="app-backend:10.15.1.24" awesome-app
To polecenie dodaje wpis do /etc/hosts
kontenera, który ma format --add-host <name>:<address>
. W tym przykładzie nazwa app-backend
zostanie rozwiązana do 10.15.1.24
. Jest to szczególnie przydatne do programowego wiązania różnych komponentów aplikacji.
Zapobiegaj zatrzymaniu kontenera, gdy nie są uruchomione żadne polecenia
Kontener zatrzyma się, jeśli na pierwszym planie nie zostanie uruchomione żadne polecenie. Użycie opcji -t
zapobiegnie zatrzymaniu kontenera, nawet gdy zostanie odłączony z opcją -d
.
docker run -t -d debian bash
Zatrzymywanie pojemnika
docker stop mynginx
Ponadto identyfikator kontenera można również użyć do zatrzymania kontenera zamiast jego nazwy.
Spowoduje to zatrzymanie działającego kontenera poprzez wysłanie sygnału SIGTERM, a następnie sygnału SIGKILL, jeśli to konieczne.
Ponadto komendy kill można użyć do natychmiastowego wysłania SIGKILL lub dowolnego innego określonego sygnału za pomocą opcji -s
.
docker kill mynginx
Określony sygnał:
docker kill -s SIGINT mynginx
Zatrzymanie kontenera nie powoduje jego usunięcia. Użyj docker ps -a
aby zobaczyć zatrzymany pojemnik.
Wykonaj inne polecenie na działającym kontenerze
W razie potrzeby możesz nakazać Dockerowi wykonanie dodatkowych poleceń na już działającym kontenerze za pomocą polecenia exec
. Potrzebujesz identyfikatora kontenera, który możesz uzyskać za pomocą docker ps
.
docker exec 294fbc4c24b3 echo "Hello World"
Możesz dołączyć interaktywną powłokę, jeśli użyjesz opcji -it
.
docker exec -it 294fbc4c24b3 bash
Uruchamianie aplikacji GUI w kontenerze Linux
Domyślnie kontener Docker nie będzie mógł uruchomić aplikacji GUI.
Wcześniej gniazdo X11 musi zostać najpierw przesłane do kontenera, aby można było z niego korzystać bezpośrednio. Zmienna środowiskowa DISPLAY musi być również przekazana:
docker run -v /tmp/.X11-unix:/tmp/.X11-unix -e DISPLAY=unix$DISPLAY <image-name>
Na początku się to nie powiedzie, ponieważ nie ustawiliśmy uprawnień do hosta serwera X:
cannot connect to X server unix:0
Najszybszym (ale nie najbezpieczniejszym) sposobem jest umożliwienie dostępu bezpośrednio za pomocą:
xhost +local:root
Po zakończeniu pracy z pojemnikiem możemy wrócić do pierwotnego stanu za pomocą:
xhost -local:root
Innym (bezpieczniejszym) sposobem jest przygotowanie pliku Docker, który zbuduje nowy obraz, który będzie korzystał z naszych poświadczeń użytkownika w celu uzyskania dostępu do serwera X:
FROM <iamge-name>
MAINTAINER <you>
# Arguments picked from the command line!
ARG user
ARG uid
ARG gid
#Add new user with our credentials
ENV USERNAME ${user}
RUN useradd -m $USERNAME && \
echo "$USERNAME:$USERNAME" | chpasswd && \
usermod --shell /bin/bash $USERNAME && \
usermod --uid ${uid} $USERNAME && \
groupmod --gid ${gid} $USERNAME
USER ${user}
WORKDIR /home/${user}
Podczas wywoływania docker build
z wiersza poleceń musimy przekazać zmienne ARG , które pojawiają się w pliku Docker:
docker build --build-arg user=$USER --build-arg uid=$(id -u) --build-arg gid=$(id -g) -t <new-image-with-X11-enabled-name> -f <Dockerfile-for-X11> .
Teraz przed spawnowaniem nowego kontenera musimy utworzyć plik xauth z uprawnieniami dostępu:
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f /tmp/.docker.xauth nmerge -
Ten plik należy zamontować w kontenerze podczas jego tworzenia / uruchamiania:
docker run -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /tmp/.docker.xauth:/tmp/.docker.xauth:rw -e XAUTHORITY=/tmp/.docker.xauth