Docker學習筆記-基礎命令

基礎命令 - 鏡像管理

獲取鏡像

使用docker pull命令從網絡上下載鏡像。php

docker pull NAME[:TAG]

例如python

$ docker pull ubuntu
Using default tag: latest
latest: Pulling from library/ubuntu

43db9dbdcb30: Downloading 1.494 MB/49.33 MB
2dc64e8f8d4f: Download complete
670a583e1b50: Download complete
43db9dbdcb30: Pull complete
2dc64e8f8d4f: Pull complete
670a583e1b50: Pull complete
183b0bfcd10e: Pull complete
Digest: sha256:c6674c44c6439673bf56536c1a15916639c47ea04c3d6296c5df938add67b54b
Status: Downloaded newer image for ubuntu:latest

不指定Tag的時候默認使用:latest,所以,上述命令其實是docker pull ubuntu:latestmysql

查看鏡像信息

使用docker images能夠列出本地主機上已有的鏡像列表。nginx

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 latest              fe1a2c2228f4        2 days ago          364 MB
mongo               latest              87bde25ffc68        2 days ago          326.7 MB
ubuntu              latest              42118e3df429        9 days ago          124.8 MB
redis               latest              4465e4bcad80        6 weeks ago         185.7 MB
nginx               latest              0d409d33b27e        8 weeks ago         182.8 MB

還能夠使用docker inspect命令查看單個鏡像的詳細信息git

$ docker inspect ubuntu
[
    {
        "Id": "sha256:42118e3df429f09ca581a9deb3df274601930e428e452f7e4e9f1833c56a100a",
        "RepoTags": [
            "ubuntu:latest"
        ],
        "RepoDigests": [
            "ubuntu@sha256:c6674c44c6439673bf56536c1a15916639c47ea04c3d6296c5df938add67b54b"
        ],
          },
          ...
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:ea9f151abb7e06353e73172dad421235611d4f6d0560ec95db26e0dc240642c1",
                "sha256:0185b3091e8ee299850b096aeb9693d7132f50622d20ea18f88b6a73e9a3309c",
                "sha256:98305c1a8f5e5666d42b578043e3266f19e22512daa8c6b44c480b177f0bf006",
                "sha256:9a39129ae0ac2fccf7814b8e29dde5002734c1699d4e9176061d66f5b1afc95c"
            ]
        }
    }
]

查看單項信息web

$ docker inspect -f {{".Config.Hostname"}} ubuntu
827f45722fd6

搜索鏡像

使用docker search命令搜索遠程倉庫中共享的鏡像。redis

docker search TERM

例如搜索名稱爲mysql的鏡像sql

$ docker search mysql
NAME                DESCRIPTION                 STARS  OFFICIAL  AUTOMATED
mysql               MySQL is a widely used...   2763   [OK]
mysql/mysql-server  Optimized MySQL Server...   178    [OK]

刪除鏡像

使用docker rmi命令刪除鏡像。docker

docker rmi IMAGE [IMAGE...]

其中IMAGE能夠是鏡像標籤或者ID。shell

例如

docker rmi ubuntu
docker rmi php:7.0.1

建立鏡像

建立鏡像有三種方法:

  • 基於已有鏡像建立

  • 基於本地模板導入

  • 基於Dockerfile建立

使用已有鏡像建立

該方法主要使用docker commit命令。

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

包含如下主要選項

  • -a --author="",做者信息

  • -m --message="",提交信息

  • -p --pause=true,提價時暫停容器運行

例如

$ docker run -i -t ubuntu:latest /bin/bash
root@5a86b68c4e6a:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr
root@5a86b68c4e6a:~# exit
exit

$ docker commit -m "create a new images" -a "mylxsw" 5a86b68c4e6a test-cont
sha256:68f1237c24a744b05a934f1317ead38fc68061ade7981eaae158a2ba8da02a9b

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test-cont           latest              68f1237c24a7        3 seconds ago       124.8 MB
php                 latest              fe1a2c2228f4        2 days ago          364 MB
mongo               latest              87bde25ffc68        2 days ago          326.7 MB
ubuntu              latest              42118e3df429        9 days ago          124.8 MB
redis               latest              4465e4bcad80        6 weeks ago         185.7 MB
nginx               latest              0d409d33b27e        8 weeks ago         182.8 MB

基於本地模板導入

基於Dockerfile建立

保存鏡像文件

使用docker save命令保存鏡像文件爲本地文件。

docker save -o ubuntu_latest.tar ubuntu:latest

載入鏡像

使用docker load從本地文件再導入鏡像壓縮包到本地鏡像倉庫。

docker load --input ubuntu_latest.tar
692b4b3b88ff: Loading layer  2.56 kB/2.56 kB
Loaded image: ubuntu:latest

上傳鏡像

上傳鏡像使用docker push命令。

docker push NAME[:TAG]

默認上傳鏡像到DockerHub官方倉庫。

基礎命令 - 容器

建立容器

使用docker create命令建立一個容器,使用該命令建立的容器處於中止狀態,須要使用docker start命令啓動容器。

docker create -it ubuntu:latest

例如:

$ docker create -it ubuntu
ddb96bff9de60765a5c10ef91c684e206866a095ec1dae2dbc66924b65d26602
$ docker ps -a
CONTAINER ID    IMAGE     COMMAND      CREATED         STATUS   PORTS    NAMES
ddb96bff9de6    ubuntu   "/bin/bash"  10 seconds ago   Created           grave_shaw

也能夠直接使用docker run命令建立並啓動一個新的容器,等價於執行命令docker createdocker start

$ docker run ubuntu /bin/echo 'Hello world'
Hello world

下面的命令讓docker啓動一個bash終端,容許用於與其進行交互

$ docker run -i -t ubuntu /bin/bash
root@d808be915a22:/#

-t選項讓docker分配一個僞終端並綁定到容器的標準輸入上,-i則讓容器的標準輸入保持打開。

大多數狀況下,咱們但願容器之後臺守護進程的形式運行,能夠使用-d選項。

$ docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"
1927a78fd6e6ca32dbf6a8efe86d83162dd974e6302d930a1766b44142f33804
$ docker ps
CONTAINER ID   IMAGE    COMMAND                  CREATED       STATUS    PORTS    NAMES
1927a78fd6e6   ubuntu  "/bin/sh -c 'while tr"   3 seconds ago  Up 2 seconds prickly_mcclintock
$ docker logs prickly_mcclintock
hello world
hello world
hello world

終止容器

使用docker stop命令終止運行中的容器。

$ docker stop prickly_mcclintock
prickly_mcclintock

容器終止後能夠使用docker start命令再次啓動,也能夠對運行的容器執行docker restart使其重啓。

進入容器

使用-d選項啓動容器後,容器會進入後臺運行,用戶沒法查看容器中的信息。有時候須要進入容器進行操做,能夠使用docker attach命令以及docker exec命令,nsenter等工具。

attach命令

docker attach命令是Docker自帶的命令,使用的時候並不太方便,當多個窗口attach到同一個容器,全部窗口都會同步顯示。某一個窗口堵塞,其它建立窗口就沒法繼續進行操做了。

docker attach prickly_mcclintock

使用docker attach以後,若是使用Ctrl+C退出,則容器也會退出運行

exec命令

Docker提供了一個更加方便的工具exec,使用它能夠直接在容器內運行命令。

$ docker exec -it 9b3d /bin/bash
root@9b3d40ebc289:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr

刪除容器

使用docker rm命令刪除處於終止狀態的容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]
  • -f --force=false 強制終止並刪除一個運行中的容器

  • -l --link=false 刪除容器的鏈接,可是保留容器

  • -v --volumes=false 刪除容器掛載的數據卷

導出容器

使用導入容器命令能夠實現將一個已經建立的容器導出到一個文件,通常能夠用於容器的遷移。

docker export CONTAINER

例如

docker export 9b3d40 > container-migrate.tar

能夠將導出的文件傳輸到其它機器上再進行導入。

導入容器

使用docker import命令導入容器做爲鏡像。

$ cat container-migrate.tar| docker import - test/ubuntu
sha256:7cae85635deaacdca3120196d9d068d6fc9980b73b2c904b80354a4ece3ceed5
$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test/ubuntu         latest              7cae85635dea        4 seconds ago       109.9 MB

基礎命令 - 數據管理

容器數據管理主要有兩種方式:

  • 數據卷

  • 數據卷容器

數據卷

數據卷是一個能夠供容器使用的特殊目錄,它繞過了文件系統,提供瞭如下特性

  • 在容器之間共享和重用

  • 修改立馬生效

  • 對數據卷的更新不會影響鏡像

  • 卷會一直存在,直到沒有容器使用

在運行容器的時候,使用-v選項建立數據卷,能夠屢次使用,建立多個數據卷。

$ docker run -i -t --name test-vol -v /Users/mylxsw/Downloads:/opt/aicode ubuntu /bin/bash
root@7ab155e22ec7:/# ls /opt/aicode/
PHP2016@DevLink  container-migrate.tar  removeDocker.sh  test-cont.tar  ubuntu-test.tar

上述命令將本地的/Users/mylxsw/Downloads目錄映射到了容器的/opt/aicode目錄。

能夠指定:ro,設置映射目錄爲只讀: -v /Users/mylxsw/Downloads:/opt/aicode:ro,同時,-v也支持掛載單個文件到容器。

數據卷容器

若是用戶須要在容器之間共享一些持續更新的數據,最簡單的方法是使用數據卷容器。數據卷容器實際上就是一個普通的容器,專美提供數據卷供其餘容器使用。

$ docker run -it -v /backup --name backup ubuntu
root@be8de791d367:/#

上述命令建立了一個用來做爲數據卷的容器,接下來建立幾個server容器,用於向該數據卷寫入數據,寫入數據後,多個容器之間是互通的。

$ docker run -it --volumes-from backup --name server1 ubuntu

使用--volumes-from指定要數據卷容器。

備份數據卷容器中的內容,能夠參考如下命令

docker run --volumes-from backup -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /backup

恢復則使用下面的命令

docker run -v /backup --name backup2 ubuntu /bin/bash
docker run --volumes-from backup2 -v $(pwd):/backup ubuntu tar xvf /backup/backup.tar

基礎命令 - 網絡配置

Docker目前提供了映射容器端口到宿主主機容器互聯的機制爲容器提供網絡服務。

端口映射

容器中運行了網絡服務,咱們能夠經過-P或者-p參數指定端口映射。

  • -P Docker會隨機映射一個49000-49900之間的端口到容器內部的開放端口。

  • -p 能夠指定要映射的端口,格式爲ip:hostPort:containerPort,能夠屢次使用-p指定多個映射的端口。

例如:

docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 5000:5000/udp training/webapp python app.py
docker run -d -P training/webapp python app.py

使用docker port [容器名稱] 容器內端口 查看端口映射綁定的地址。

docker port nostalgic_morse 5000

容器互聯通訊

容器的連接(linking)系統是除了端口映射外的另外一種容器應用之間交互的方式,它會在源和接收容器之間建立一個隧道,接收容器能夠看到源容器指定的信息。

容器之間互聯經過--link參數指定,格式爲--link name:alias,其中name爲要連接到的容器的名稱,alias爲這個鏈接的別名。

docker run -d --name mysql-demo -e MYSQL_ROOT_PASSWORD=root mysql
docker run --rm --name web --link mysql-demo:db ubuntu env

-w567

使用docker ps能夠看到容器的鏈接。

Docker會在兩個互聯的容器之間建立一個安全的隧道,並且不用映射端口到宿主主機。Docker中經過兩種方式爲容器公開鏈接信息:

  • 環境變量 環境變量的方式採用鏈接別名的大寫前綴開頭,好比前面的例子中,全部以DB_開頭的環境變量。

  • 更新/ect/hosts文件 Docker也會添加host信息到父容器的/etc/hosts文件

查看/etc/hosts文件:

docker run --rm --name web --link mysql-demo:db -i -t ubuntu /bin/bash

-w615

Dockerfile

Dockerfile是一個文本格式的配置文件,用戶能夠使用Dockerfile快速建立自定義的鏡像。

基本結構

通常來講,Dockerfile分爲四部分:

  • 基礎鏡像信息

  • 維護者信息

  • 鏡像操做指令

  • 容器啓動時執行的指令

指令

指令通常格式爲INSTRUCTION arguments

FROM

格式爲FROM <image>。第一條指令必須爲FROM指令,指定了基礎鏡像。

FROM ubuntu:latest

MAINTAINER

格式爲MAINTAINER <name>指定維護者信息。

MAINTAINER mylxsw mylxsw@aicode.cc

RUN

格式爲RUN <command>或者RUN ["executable", "param1", "param2"...]。每條指令將在當前鏡像的基礎上執行,並提交爲新的鏡像。

格式RUN <command>時將在shell終端中執行命令,也就是/bin/sh -c中執行,而RUN ["executable", "param1", "param2"...]則使用exec執行。

CMD

該命令提供容器啓動時執行的命令,每一個Dockerfile中只能與一條CMD命令,若是指定了多條,則只有最後一條會被執行。若是用戶啓動容器的時候指定了運行的命令,則會覆蓋CMD指令。

格式支持三種:

  • CMD ["executable", "param1", "param2"] 使用exec執行

  • CMD command param1 param2 使用/bin/sh -c執行

  • CMD ["param1", "param2"] 提供給ENTRYPOINT的默認參數

EXPOSE

格式爲EXPOSE <port> [<port>...],該指令用於告訴Docker容器要暴露的端口號,供互聯繫統使用。

EXPOSE 22 80 8443

上述指令暴露了22, 80, 8443端口供互聯的系統使用,使用的時候能夠指定-P或者-p參數進行端口映射。

ENV

格式爲ENV <key> <value>。指定一個環境變量,會被後續的RUN指令使用,而且在容器運行時保持。

好比:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.35

ADD

格式爲ADD <src> <dest>。該命令複製指定的<src><dest>,其中<src能夠是Dockerfile所在目錄的一個相對路徑(文件或目錄),也能夠是網絡上的資源路徑或者是tar包。

若是<src>是tar包的話,會在dest位置自動解壓爲目錄。

COPY

格式爲COPY <scr> <dest>,複製本地主機的<src>到容器的<dest>,目標路徑不存在則自動建立。使用本地目錄爲源目錄時,推薦使用COPY。

注意,ADD命令和COPY命令基本上是同樣的,只不過是ADD命令能夠複製網絡資源,同時會對壓縮包進行自動解壓,而COPY則是單純的複製本地文件(目錄)。

ENTRYPOINT

配置容器啓動後執行的命令,而且不會被docker run提供的參數覆蓋。每一個Dockerfile中只能有一個ENTRYPOINT,當指定多個的時候,只有最後一個生效。

格式有兩種:

  • ENTRYPOINT ["executable", "param1", "param2"]

  • ENTRYPOINT command param1 param2

VOLUME

格式爲VOLUME ["/data"],建立一個能夠從本地主機或其它容器掛載的掛載點,通常用來存放數據庫和須要保持的數據等。

USER

格式爲USER daemon,用於指定運行容器時的用戶名或者UID,後續的RUN命令也會使用指定的用戶。

WORKDIR

格式爲WORKDIR /path/to/workdir,用於爲後續的RUN,CMD,ENTRYPOINT指令配置工做目錄。

能夠屢次使用,若是後續指定的路徑是相對路徑,則會基於前面的路徑。

WORKDIR /a
WORKDIR b
RUN pwd

則最後獲得的路徑是/a/b

ONBUILD

指定基於該鏡像建立新的鏡像時自動執行的命令。格式爲ONBUILD [INSTRUCTION]

建立鏡像

編寫完Dockerfile以後,就能夠經過docker build命令構建一個鏡像了。

能夠經過.dockerignore指定忽略的文件和目錄,相似於git中的.gitignore文件。

好比

docker build -t build_repo/first_image /tmp/docker_builder

參考:

相關文章
相關標籤/搜索