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的第一列。
第二彈:
- 檢視docker版本:
docker version 或者 docker info - 執行本機docker服務:
service 命令的用法:sudo service docker start
systemctl 命令的用法:sudo systemctl start docker
- 檔案檢視等:
列出本機的所有 image 檔案:docker image ls
刪除 image 檔案:docker image rm [imageName]
:為repository:tag
這樣只能刪除已經停止的容器,並不能刪除執行狀態下容器,如果要強行刪除執行狀態下容器,則需要假-f,原理也是先停止。 - 從官方倉庫中拉取docker,預設是從library下面
docker image pull library/hello-world
即這樣也是從library下面:
docker image pull hello-world
- 執行一個image
docker container run hello-world
某些時候,run命令可能會出錯:
125:Docker daemon執行出錯,例如指定了不支援的docker命令引數
126:所指定命令無法執行,例如許可權出錯
127:容器內命令無法找到。 - 殺死不會自動終止的容器:
docker container kill [containID]
過程:首先會像容器傳送一個SIGTERM
訊號,等待一段超過時間(預設為10s)後,再發送SIGKILL
訊號。 - 檢視檔案:可以檢視到容器id
列出本機正在執行的容器:docker container ls
列出本機所有容器,包括終止執行的容器:docker container ls --all
- 執行容器:
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。 CMD命令
我們可以把這個命令寫在 Dockerfile 裡面,這樣容器啟動以後,這個命令就已經執行了,不用再手動輸入了。CMD命令和RUN命令區別:
你可能會問,RUN命令與CMD命令的區別在哪裡?簡單說,RUN命令在 image 檔案的構建階段執行,執行結果都會打包進入 image 檔案;CMD命令則是在容器啟動後執行。另外,一個 Dockerfile 可以包含多個RUN命令,但是隻能有一個CMD命令。注意,指定了CMD命令以後,docker container run命令就不能附加命令了(比如前面的/bin/bash),否則它會覆蓋CMD命令。現在,啟動容器可以使用下面的命令。
- 釋出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]
docker container start [containerID]
前面的docker container run
命令是新建容器,每執行一次,就會新建一個容器。同樣的命令執行兩次,就會生成兩個一模一樣的容器檔案。如果希望重複使用容器,就要使用docker container start
命令,它用來啟動已經生成. 已經停止執行的容器檔案。docker container stop [containerID]
前面的docker container kill命令終止容器執行,相當於向容器裡面的主程序發出 SIGKILL 訊號。而docker container stop命令也是用來終止容器執行,相當於向容器裡面的主程序發出 SIGTERM 訊號,然後過一段時間再發出 SIGKILL 訊號。docker container logs [containerID]
docker container logs
命令用來檢視 docker 容器的輸出,即容器裡面 Shell 的標準輸出。如果docker run命令執行容器的時候,沒有使用-it引數,就要用這個命令檢視輸出。docker container exec [containerID] /bin/bash
docker container exec
命令用於進入一個正在執行的 docker 容器。如果docker run
命令執行容器的時候,沒有使用-it引數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。docker container cp [containID]:[/path/to/file]
docker container cp
命令用於從正在執行的 Docker 容器裡面,將檔案拷貝到本機。下面是拷貝到當前目錄的寫法。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/webapp
python 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直接訪問的。