Docker 精通系列
- Docker 精通之入門
- Docker 精通之微服務
- Docker 精通之常用命令
- Docker 精通之 Dockerfile
配置文件路徑
/etc/sysconfig/docker?
docker鏡像及容器目錄
主目錄:/var/lib/docker
容器存放目錄:/var/lib/docker/containers/
鏡像存放目錄:/var/lib/docker/image
幫助信息
docker --help
docker command --help????# 比如?docker image --help
docker info ???????????????????????# 顯示docker的安裝信息,及運行狀態
docker version??????????????????# 版本版本信息
docker container 相關
$ docker container ls? ? ? ? ? ?
列出本機正在運行的容器
$ docker container ls --all? ?
列出本機所有容器,包括終止運行的容器
$ docker container kill [containID]? ? ?
終止容器
$ docker container rm [containerID] ?
刪除終止運行的容器,參數如下:
- -v:刪除容器掛載的數據卷,默認情況下刪除容器不會刪除數據卷,要刪除一個數據卷,必須在刪除最后一個掛載該數據卷的容器時使用 -v 參數
- -f:如果容器正在運行,則強行終止并刪除
$ docker [container] run -p 8000:3000 koa-demo?
運行容器,詳細參數如下:
- -p 8000:3000? ? ?# 容器的 3000 端口映射到本機的 8000 端口。
- -d? ? ? ? ? ? ? ? ? ? ? ?# 容器啟動后,在后臺運行
- -it? ? ? ? ? ? ? ? ? ? ? ?#?容器的 Shell 映射到當前的 Shell,然后你在本機窗口輸入的命令,就會傳入容器。-t分配一個偽終端并綁定在容器的標準輸入上,-i讓容器的標準輸入保持打開
- koa-demo:0.0.1 # image 文件的名字(如果有標簽,還需要提供標簽,默認是 latest 標簽)。
- /bin/bash? ? ? ? ? ? # 容器啟動以后,內部第一個執行的命令。這里是啟動 Bash,保證用戶可以使用 Shell。
- --name flp? ? ? ? ? # 容器的名字flp
- --rm? ? ? ? ? ? ? ? ? ? # 容器終止運行后自動刪除容器文件。
- --volume "$PWD/":/var/www/html? # 將當前目錄($PWD)映射到容器的/var/www/html(Apache 對外訪問的默認目錄)。因此,當前目錄的任何修改,都會反映到容器里面,進而被外部訪問到,可指定多個;
- --volume /var/www/html? ? ? ? ? ? ? ? # 在容器內部創建一個共享數據卷,數據卷只有在未被任何容器使用時才能被刪除
- --volume-from 容器ID? ? ? ? ? ? ? ? ? ? # 掛載容器ID中的共享數據卷,實現在容器內部共享數據卷
- -v? ?# 同--volume
- :ro? # 只讀,"$PWD/":/var/www/html:ro
- --env MYSQL_ROOT_PASSWORD=123456 # 向容器進程傳入一個環境變量MYSQL_ROOT_PASSWORD,該變量會被用作 MySQL 的根密碼。
- --env MYSQL_DATABASE=wordpress? ? ? ? ? ?# 向容器進程傳入一個環境變量MYSQL_DATABASE,容器里面的 MySQL 會根據該變量創建一個同名數據庫(本例是WordPress)
- --link wordpressdb:mysql ????# 表示 WordPress 容器要連到wordpressdb容器,冒號表示該容器的別名是mysql
- -p 127.0.0.2:8080:80 ??????????# 將容器的 80 端口映射到127.0.0.2的8080端口
- -P? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 隨機映射一個端口
- --cpuset-cpus=0-3? ? ? ? ? ? ? ?# 設定容器可以使用哪些主機上的cpu核心,0-3:表示0核~3核,4個核心,1,2:表示1核和2核
- --memory=104857600? ? ? ? ?# 可以使用主機內存的上限,單位是B,這里表示100M 1024B * 1024B * 100
使用docker run命令來啟動容器,docker在后臺運行的標準操作包括
- 1.檢查本地是否存在指定的鏡像,不存在則從公有倉庫下載
- 2.使用鏡像創建并啟動容器
- 3.分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀可寫層
- 4.從宿主主機配置的網橋接口中橋接一個虛擬接口道容器中去
- 5.從地址池分配一個ip地址給容器
- 6.執行用戶指定的應用程序
- 7.執行完畢之后容器被終止
$ docker container start [containerID]
前面的docker container run命令是新建容器,每運行一次,就會新建一個容器。如果希望重復使用容器,就要使用docker container start命令,它用來啟動已經生成、已經停止運行的容器文件。
$ bash container stop [containerID]
前面的docker container kill命令終止容器運行,相當于向容器里面的主進程發出 SIGKILL 信號。而docker container stop命令也是用來終止容器運行,相當于向容器里面的主進程發出 SIGTERM 信號,然后過一段時間再發出 SIGKILL 信號。這兩個信號的差別是,應用程序收到 SIGTERM 信號以后,可以自行進行收尾清理工作,但也可以不理會這個信號。如果收到 SIGKILL 信號,就會強行立即終止,那些正在進行中的操作會全部丟失。
$ docker container logs [containerID]?
命令用來查看 docker 容器的輸出,即容器里面 Shell 的標準輸出。如果docker run命令運行容器的時候,沒有使用-it參數,就要用這個命令查看輸出。
- -f:實時輸出
$ docker container exec -it [containerID] /bin/bash?
用于進入一個正在運行的 docker 容器。如果docker run命令運行容器的時候,沒有使用-it參數,就要用這個命令進入容器。一旦進入了容器,就可以在容器的 Shell 執行命令了。也可以把 /bin/bash 換成命令,作用是在容器里執行命令,并輸出結果
$ docker container cp [containID]:[/path/to/file] [/path/to/file]
# docker container cp命令用于從正在運行的 Docker 容器里面,將文件拷貝到本機。也可以將兩個參數換下位置,就是將本機文件拷貝到docker
$ docker attach 容器ID? ?
連接到啟動的容器
docker 命令
- docker search -s 100 centos ??#搜索鏡像centos,-s :搜索星標至少為100的鏡像
- docker inspect 鏡像ID? ? ? ? ? ? ?#查看鏡像內邊信息
- docker restart 容器ID? ? ? ? ? ? ? #重啟鏡像
- docker?pull?image_name? ? ? ? ?#下載鏡像
- docker?ps? ? ? ?#列出當前所有正在運行的container??
- ?-a? ?#列出所有的container??
- ?-l? ? #列出最近一次啟動的container????
- docker rm?容器ID #刪除container
- -f:如果容器正在運行,則強行終止并刪除
- -v:刪除容器掛載的數據卷,默認情況下刪除容器不會刪除數據卷,要刪除一個數據卷,必須在刪除最后一個掛載該數據卷的容器時使用 -v 參數
- docker rm `docker ps -a -q` #刪除所有容器
- docker kill `docker ps -q`
- docker rmi `docker images -q -a`
- docker wait 容器ID #阻塞對容器的其他調用方法,直到容器停止后退出
- docker top 容器ID? #查看容器中運行的進程
- docker diff?容器ID? #查看容器中的變化
- docker inspect?容器ID #查看容器詳細信息(輸出為Json)
- -f:查找特定信息,如docker inspect?-f?'{{ .NetworkSettings.IPAddress }}'
- docker port?容器ID?5000 #查看容器的5000端口對應本地機器的IP和端口號
容器,鏡像導入導出
docker export 容器ID > container.tar #導出容器migrate.tar,相當于快照
docker import container.tar - test/ubuntu #導入鏡像,鏡像名字為test/ubuntu,load不可以指定名字
cat container.tar| docker import - test/ubuntu #導入鏡像,鏡像名字為test/ubuntu,load不可以指定名字docker save -o image.tar 鏡像ID ?#將一個鏡像導出為文件,會保存鏡像的所有記錄
docker load --input image.tar??? #導入image.tar到本地鏡像,import可以指定名字
docker load < image.tar ???? ????#導入image.tar到本地鏡像,import可以指定名字
將 container 持久化為一個 image
$ docker?commit?容器ID?新鏡像名?
- -a,?--author=""? ? ? # 作者?
- -m,?--message=""?# 注釋
- -p? ? ? ? ? ? ? ? ? ? ? ? ? # 在commit是,暫停容器執行
發布 image 到倉庫
發布 image 需要有對應的tag?
# 1、首先是登錄docker hub
[root@docker-test1 ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username (wangshibo): you_name
Password:
Login Succeeded[root@docker-test1 ~]# docker push wangshibo/myubuntu:v1
The push refers to a repository [docker.io/wangshibo/myubuntu]
An image does not exist locally with the tag: docker.io/wangshibo/myubuntu# 2、這里需要將ubuntu:v1鏡像改名,在名稱前加上自己的docker hub的Docker ID,即wangshibo
[root@docker-test1 ~]# docker tag 6ce4aedd12cd wangshibo/myubuntu:v1
[root@docker-test1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu v1 6ce4aedd12cd 6 minutes ago 84.1 MB
wangshibo/myubuntu v1 6ce4aedd12cd 6 minutes ago 84.1 MB# 3、再次進行推送(注意:下面的v1的tag標簽可以不打,默認是latest)。推送操作時間稍微會有一點長,耐心等待~
[root@docker-test1 ~]# docker push myubuntu:v1
The push refers to a repository [docker.io/myubuntu]
b5948ba9486d: Pushed
8d7ea83e3c62: Mounted from library/ubuntu
...
a30b835850bf: Mounted from library/ubuntu
v1: digest: sha256:e9cd9075d262848a307c92751e1a5890d883b814a31abd118161442461a1ca2d size: 1564# 4、最后登錄自己的Docker Hub,即https://hub.docker.com/,登錄后,在Repositories里面就可以看到自己在上面推送的鏡像myubuntu:v1了,這是個對外的鏡像,可以在網絡上下載。在Docker hub上可以看到這個鏡像的下載命令(注意下載時跟上tag標簽,如果是latest的默認tag可以不跟)
也可以直接在Docker hub上刪除這個鏡像(Repositories-鏡像-Settings-delete)# 5、在本機刪除這個鏡像
[root@docker-test1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myubuntu v1 6ce4aedd12cd 15 minutes ago 84.1 MB
wangshibo/myubuntu v1 6ce4aedd12cd 15 minutes ago 84.1 MB# 注意上面有兩個6ce4aedd12cd的鏡像ID,此時直接使用這個鏡像ID是刪除不掉的
[root@docker-test1 ~]# docker rmi 6ce4aedd12cd
Error response from daemon: conflict: unable to delete 6ce4aedd12cd (must be forced) - image is referenced in multiple repositories# 應該先刪除docker tag改名前的鏡像,使用鏡像名稱刪除。(一般在docker tag鏡像改名后,最好刪除改名前的鏡像)
[root@docker-test1 ~]# docker rmi myubuntu:v1
Untagged: myubuntu:v1
Untagged: wangshibo/myubuntu@sha256:e9cd9075d262848a307c92751e1a5890d883b814a31abd118161442461a1ca2d[root@docker-test1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
wangshibo/myubuntu v1 6ce4aedd12cd 15 minutes ago 84.1 MB# 這個時候就可以刪除鏡像ID刪除了
[root@docker-test1 ~]# docker rmi 6ce4aedd12cd
Untagged: wangshibo/myubuntu:v1
Deleted: sha256:6ce4aedd12cda693d0bbb857cc443a56f9f569106e09ec61aa53563d0932ea4d
Deleted: sha256:0ddeb6a16badd042914c2e72b9ef0331550c1cdcc4bdc6650a90cd9f57f1501b
[root@docker-test1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/ubuntu 16.04 7aa3602ab41e 5 weeks ago 115 MB
docker image 相關
$ docker image ls -a //??docker image ls --all
列出本機的所有 image 文件。
$ docker image rm [imageName]
刪除 image 文件
$ docker image tag [imageName] [username]/[repository]:[tag]
打標簽。$ docker image tag koa-demos:0.0.1 ruanyf/koa-demos:0.0.1? ? ?#?koa-demos:0.0.1 是 image 的 name,。ruanyf/koa-demos(新的名字):0.0.1(tag)
$ docker image build -t [username]/[repository]:[tag] .?
也可以不標注用戶名,重新構建一下 image 文件。
$ docker image push [username]/[repository]:[tag]
發布 image 文件。
$ docker image pull library/hello-world
將 image 文件從倉庫抓取到本地。library/hello-world是 image 文件在倉庫里面的位置,其中library是 image 文件所在的組,hello-world是 image 文件的名字。由于 Docker 官方提供的 image 文件,都放在library組里面,所以它的是默認組,可以省略。因此,上面的命令可以寫成這樣。$ docker image pull hello-world
$ docker image build -t koa-demo:0.0.1 .
創建image 文件,會用到dockerfile文件,參考?Docker 精通之 Dockerfile
- ????.???????#注意最后有一個 "."代表本地路徑
- ????-t?????#指定image名字
- ????: ????#冒號后面可以添加標簽
docker images 相關
$ docker images -a
展示本地的所有鏡像,默認隱藏中間的鏡像
$ docker images --digests
展示鏡像的摘要
$ docker images -f xxxx
查看對應的過濾條件,這個過濾標簽的格式是 “key=value”,如果有多個條件,則使用這種 --filter "key1=value" --filter "key2=value"。比如:過濾沒有打標簽的鏡像docker images -f "dangling=true",當前支持的過濾配置的key為:
- dangling:顯示標記為空的鏡像,值只有true和false
- label:這個是根據標簽進行過濾,其中lable的值,是docker在編譯的時候配置的或者在Dockerfile中配置的
- before:這個是根據時間來進行過濾,其中before的value表示某個鏡像構建時間之前的鏡像列表
- since:跟before正好相反,表示的是在某個鏡像構建之后構建的鏡像
- reference:這個是添加正則進行匹配
$?docker rmi $(docker images -f "dangling=true" -q)
表示清理當前repo:tag為<none>的鏡像。在對應的鏡像repo:tag構建新的鏡像的時候,舊的鏡像就會從repo:tag中移走,進而成為<none>,這個時候,我們就可以對這些進行清理
$ docker images --format
這個是進行對展示的進行格式化話展示
Placeholder | Description |
---|---|
.ID | Image ID |
.Repository | Image repository |
.Tag | Image tag |
.Digest | Image digest |
.CreatedSince | Elapsed time since the image was created |
.CreatedAt | Time when the image was created |
.Size | Image disk size |
$?docker images -q
這個其實跟 docker images --format "{{.ID}}" 效果是一樣的,是只展示ID