1. 程式人生 > >Docker 學習小記

Docker 學習小記

這些天,在學Docker ,看的《Docker 技術入門與實踐》,書挺不錯,記錄下來一些基礎筆記。

基礎命令

  • docker images,可以列出本映象所有資訊。
  • 使用docker inspect [imageName],可以看到該映象的詳細資訊。
  • 使用docker history [imageName],可以看到該映象的構建歷史,不是有很多層layer組成嘛。
  • 使用docker search [imageName],搜尋映象:
  • docker search –automated -s 3 nginx :-s 3表示輸出指定星級以上映象,預設為0,即輸出所有。 –automated,自動構建的版本
  • 使用docker rmi [imageName],刪除某一個映象或者多個。空格間隔,或者rmi後面假image id也行
  • docker commit ,建立映象,區別於構建映象:
anla7856@localhost:~$ docker run -it tomcat:latest /bin/bash
    root@4418d7440391:/usr/local/tomcat# ls
    LICENSE  NOTICE  RELEASE-NOTES  RUNNING.txt  bin  conf  include  lib  logs  native-jni-lib  temp  webapps  work
    root@4418d7440391
:/usr/local/tomcat# touch test root@4418d7440391:/usr/local/tomcat# ls LICENSE NOTICE RELEASE-NOTES RUNNING.txt bin conf include lib logs native-jni-lib temp test webapps work root@4418d7440391:/usr/local/tomcat# exit exit anla7856@localhost:~$ docker commit -m "add new file" -a "anla7856"
4418d7440391 tomcat:1.1 sha256:f5204f579cb96962b118f8929fa59289a6ee35441f66439e3a91af061bde365c anla7856@localhost:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE tomcat 1.1 f5204f579cb9 8 seconds ago 554MB helloworld 0.0.0.1 9570f8be1bef 26 hours ago 565MB recruit 0.0.4 03a79f16c3e5 29 hours ago 588MB recruit 0.0.3 bcd846b48852 35 hours ago 592MB <none> <none> 7172c01942a8 2 days ago 730MB <none> <none> 01f47b6c62f2 2 days ago 730MB tomcat latest 33e02377a00f 3 days ago 554MB hello-world latest e38bc07ac18e 3 days ago 1.85kB mysql latest 5195076672a7 4 weeks ago 371MB
其中,docker commit 命令引數解釋如下:
Usage:  docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

Create a new image from a container's changes

Options:
  -a, --author string    Author (e.g., "John Hannibal Smith <[email protected]>")
  -c, --change list      Apply Dockerfile instruction to the created image
  -m, --message string   Commit message
  -p, --pause            Pause container during commit (default true)

- docker import 基於本地模板匯入:

    anla7856@localhost:~/file$ cat apache-maven-3.5.3-src.tar.gz | docker import - maven:3.5.3
    sha256:c481adb6e0fe0df498c81e6c86584ba3ba5e965d3842e55bce4ea856067a6c7f
    anla7856@localhost:~/file$ docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    maven               3.5.3               c481adb6e0fe        7 seconds ago       8.34MB
  • docker save 匯出映象,可以把一個image,匯出為tar檔案:
    anla7856@localhost:~/file$ docker save -o tomcat-latest.tar tomcat:latest
    anla7856@localhost:~/file$ ls |grep tomcat-la
    tomcat-latest.tar
    anla7856@localhost:~/file$ 
  • docker load 載入映象
    anla7856@localhost:~/file$ docker load --input tomcat-latest.tar
    Loaded image: tomcat:latest

如果系統有重名的,即imageName和tar都一致,不會覆蓋。可以從生成時間上看出來。

  • Dockerfile裡面的workDir,是為以後的RUN,CMD,ENTRYPOINT指定配置工作目錄的。
  • docker build -t ,-t代表標籤資訊。
  • 建立容器:docker create,建立一個容器,但是容器處於停止狀態,可以用docker start命令來啟動它。
  • 進入容器:當帶有-d在後臺執行時候,則有時需要進入容器:
    attach命令:
anla7856@localhost:~/file$ docker run -itd tomcat:latest 
    a592bf589b031ed1e8e26a42168becb150c31716d7550f14026e5ec675fc999f
    anla7856@localhost:~/file$ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    a592bf589b03        tomcat:latest       "catalina.sh run"   7 seconds ago       Up 5 seconds        8080/tcp            cranky_bose
    anla7856@localhost:~/file$ docker attach cranky_bose
    exec命令:可以在容器內直接執行任意命令。
    anla7856@localhost:~/file$ docker run -itd tomcat:latest 
    1b962404e27ab7d460471d2de64b143247d3443ac49adb619fabf40cb12a3a3b
    anla7856@localhost:~/file$ docker container ls
    CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
    1b962404e27a        tomcat:latest       "catalina.sh run"   18 seconds ago      Up 16 seconds       8080/tcp            affectionate_galileo
    anla7856@localhost:~/file$ docker exec -it 1b962404e27a /bin/bash
    root@1b962404e27a:/usr/local/tomcat# ls
    LICENSE  RELEASE-NOTES  bin   include  logs        temp work
    NOTICE   RUNNING.txt    conf  lib      native-jni-lib  webapps
    root@1b962404e27a:/usr/local/tomcat# 
  • 匯入和匯出檔案
    docker export和docker import:
    docker export -o *.tar [containerid]
    docker import *.tar [repositoryName] : docker images的第一列。

第二彈:

  1. 檢視docker版本:
    docker version 或者 docker info
  2. 執行本機docker服務:
    service 命令的用法: sudo service docker start
    systemctl 命令的用法: sudo systemctl start docker
  3. 檔案檢視等:
    列出本機的所有 image 檔案:docker image ls
    刪除 image 檔案:docker image rm [imageName] :為repository:tag
    這樣只能刪除已經停止的容器,並不能刪除執行狀態下容器,如果要強行刪除執行狀態下容器,則需要假-f,原理也是先停止。
  4. 從官方倉庫中拉取docker,預設是從library下面
    docker image pull library/hello-world
    即這樣也是從library下面:
    docker image pull hello-world
  5. 執行一個image
    docker container run hello-world
    某些時候,run命令可能會出錯:
    125:Docker daemon執行出錯,例如指定了不支援的docker命令引數
    126:所指定命令無法執行,例如許可權出錯
    127:容器內命令無法找到。
  6. 殺死不會自動終止的容器:
    docker container kill [containID]
    過程:首先會像容器傳送一個SIGTERM訊號,等待一段超過時間(預設為10s)後,再發送SIGKILL訊號。
  7. 檢視檔案:可以檢視到容器id
    列出本機正在執行的容器:docker container ls
    列出本機所有容器,包括終止執行的容器:docker container ls --all
  8. 執行容器:
    docker container run -p 8000:3000 -it recruit /bin/bash
    引數用途:
    -p引數:容器的 3000 埠對映到本機的 8000 埠。
    -it引數:容器的 Shell 對映到當前的 Shell,然後你在本機視窗輸入的命令,就會傳入容器。
    koa-demo:0.0.1:image 檔案的名字(如果有標籤,還需要提供標籤,預設是 latest 標籤)。
    /bin/bash:容器啟動以後,內部第一個執行的命令。這裡是啟動 Bash,保證使用者可以使用 Shell。
  9. CMD命令
    我們可以把這個命令寫在 Dockerfile 裡面,這樣容器啟動以後,這個命令就已經執行了,不用再手動輸入了。

  10. CMD命令和RUN命令區別:
    你可能會問,RUN命令與CMD命令的區別在哪裡?簡單說,RUN命令在 image 檔案的構建階段執行,執行結果都會打包進入 image 檔案;CMD命令則是在容器啟動後執行。另外,一個 Dockerfile 可以包含多個RUN命令,但是隻能有一個CMD命令。

    注意,指定了CMD命令以後,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。現在,啟動容器可以使用下面的命令。

  11. 釋出image檔案
    一註冊:去hub.docker.com裡面註冊
    二登入: docker login
    三標註image的使用者名稱和版本:
    $ docker image tag [imageName] [username]/[repository]:[tag]
    # 例項
    $ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1
    四釋出image檔案:$ docker image push [username]/[repository]:[tag]
  12. docker container start [containerID]
    前面的docker container run命令是新建容器,每執行一次,就會新建一個容器。同樣的命令執行兩次,就會生成兩個一模一樣的容器檔案。如果希望重複使用容器,就要使用docker container start命令,它用來啟動已經生成. 已經停止執行的容器檔案。
  13. docker container stop [containerID]
    前面的docker container kill命令終止容器執行,相當於向容器裡面的主程序發出 SIGKILL 訊號。而docker container stop命令也是用來終止容器執行,相當於向容器裡面的主程序發出 SIGTERM 訊號,然後過一段時間再發出 SIGKILL 訊號。
  14. docker container logs [containerID]
    docker container logs命令用來檢視 docker 容器的輸出,即容器裡面 Shell 的標準輸出。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令檢視輸出。
  15. docker container exec [containerID] /bin/bash
    docker container exec命令用於進入一個正在執行的 docker 容器。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。
  16. docker container cp [containID]:[/path/to/file]
    docker container cp命令用於從正在執行的 Docker 容器裡面,將檔案拷貝到本機。下面是拷貝到當前目錄的寫法。
  17. docker container run 小結:
$ docker container run \
      --rm \
      --name wordpress \
      --volume "$PWD/":/var/www/html \
      php:5.6-apache

解釋:
--rm:停止執行後,自動刪除容器檔案。
--name wordpress:容器的名字叫做wordpress。
--volume "$PWD/":/var/www/html:將當前目錄($PWD)對映到容器的/var/www/html(Apache 對外訪問的預設目錄)。因此,當前目錄的任何修改,都會反映到容器裡面,進而被外部訪問到。

    $ docker container run \
      -d \
      --rm \
      --name wordpressdb \
      --env MYSQL_ROOT_PASSWORD=123456 \
      --env MYSQL_DATABASE=wordpress \
      mysql:5.7

解釋:
-d:容器啟動後,在後臺執行。
--rm:容器終止執行後,自動刪除容器檔案。
--name wordpressdb:容器的名字叫做wordpressdb
--env MYSQL_ROOT_PASSWORD=123456:向容器程序傳入一個環境變數MYSQL_ROOT_PASSWORD,該變數會被用作 MySQL 的根密碼。
--env MYSQL_DATABASE=wordpress:向容器程序傳入一個環境變數MYSQL_DATABASE,容器裡面的 MySQL 會根據該變數建立一個同名數據庫(本例是WordPress)。

$ docker container run \
      --rm \
      --name wordpress \
      --volume "$PWD/":/var/www/html \
      --link wordpressdb:mysql \
      phpwithmysql

解釋:
中間 link意思是:
--link wordpressdb:mysql,表示 WordPress 容器要連到wordpressdb容器,冒號表示該容器的別名是mysql
18. 使用docker-compose命令:
首先docker-compose.yml檔案示例:

    mysql:
        image: mysql:5.7
        environment:
         - MYSQL_ROOT_PASSWORD=123456
         - MYSQL_DATABASE=wordpress
    web:
        image: wordpress
        links:
         - mysql
        environment:
         - WORDPRESS_DB_PASSWORD=123456
        ports:
         - "127.0.0.3:8080:80"
        working_dir: /var/www/html
        volumes:
         - wordpress:/var/www/html

執行 docker-compose up
停止:docker-compose stop
上面的檔案表示:
關閉以後,這兩個容器檔案還是存在的,寫在裡面的資料不會丟失。下次啟動的時候,還可以複用。
命令:docker-compose rm可以把這兩個容器檔案刪除(容器必須已經停止執行)。
19. dockerfile映象時候,包括很多層(layer),以不同id標識:6c953ac5d795,如果不同版本映象有相同的層,本地只會儲存一份。
20. docker 容器概念:就是映象的一個執行例項,映象是靜態的只讀檔案,而容器是帶有執行時需要的可寫檔案層。
21. docker的註冊伺服器和倉庫名:
倉庫/repository是用來存映象地方,註冊伺服器registry,裡面可以有很多倉庫。
例如:anla7856.com/recruit
anla7856.com是註冊伺服器,而recruit是倉庫名。
如果是anla7856/recruit
則是由anla7856建立的,並維護的一個映象recruit。
22. 可以從註冊伺服器的拉映象,然後讓他與官方保持一致:
docker pull index.anla7856.com/library/tomcat:latest
然後用tag命令,更新映象標籤,讓其與官方標籤一致:
docker tag index.anla7856.com/library/tomcat:latest tomcat:latest
23. 資料卷:容器內資料直接對映到本地主機環境
docker run -d -p --name web -v /src/webapp:/opt/webapp training/webapppython app.py
同樣,也可以掛載一個檔案作為資料卷。
資料卷容器:使用特定容器維護資料卷,可以在容器和主機,容器和容器之間共享資料,並實現資料的備份與恢復。
docker run -it -v /dbdata --name dbdata ubuntu 即在ubuntu容器內,建立一個數據卷/dbdata.即根木錄下有個dbdata資料夾
同時,多個相同的映象執行時,也可以共有著一個數據卷使用--volumes-from
docker run -it --volumes-from dbdate --name db1 ubuntu
docker run -it --volumes-from dbdate --name db2 ubuntu
把容器db1和db2都掛載在同一個相同的/dbdata目錄。即/dbdata這個目錄三個檔案操作都能看得到。
24. 容器具有自己的內部網路和ip地址,使用docker+inspect+容器id可以獲取具體資訊。
25. 容器互聯,可以讓多個容器應用快速互動的方式,它會在源和接受容器之間建立連線關係,接受容器可以通過容器快速訪問到源容器。
-rm和-d不能同時使用
互聯用–link引數
建立一個db1:[email protected]:~/file$ docker run -d --name db1 postgres
然後web1連線到db1:[email protected]:~/file$ docker run -d -P --name web1 --link db1:db tomcat
檢視web1裡面的環境變數:

PATH=/usr/local/tomcat/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
        HOSTNAME=18a460c09d1c
        TERM=xterm
        DB_PORT=tcp://172.17.0.2:5432
        DB_PORT_5432_TCP=tcp://172.17.0.2:5432
        DB_PORT_5432_TCP_ADDR=172.17.0.2
        DB_PORT_5432_TCP_PORT=5432
        DB_PORT_5432_TCP_PROTO=tcp
        DB_NAME=/web1/db

檢視web1裡面的host檔案:

    anla7856@localhost:~/file$ docker exec -it 18 /bin/bash
    root@18a460c09d1c:/usr/local/tomcat# cat /etc/hosts
    127.0.0.1   localhost
    ::1 localhost ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    172.17.0.2  db 88be8db95341 db1
    172.17.0.3  18a460c09d1c

可知,對於–link原理就是更改host直接訪問的。