Docker 精通系列
/etc/sysconfig/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 ls
列出本机正在运行的容器
$ docker container ls --all
列出本机所有容器,包括终止运行的容器
$ docker container kill [containID]
终止容器
$ docker container rm [containerID]
删除终止运行的容器,参数如下:
$ docker [container] run -p 8000:3000 koa-demo
运行容器,详细参数如下:
使用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参数,就要用这个命令查看输出。
$ 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 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可以指定名字
$ docker commit 容器ID 新镜像名
发布 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 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
$ docker images -a
展示本地的所有镜像,默认隐藏中间的镜像
$ docker images --digests
展示镜像的摘要
$ docker images -f xxxx
查看对应的过滤条件,这个过滤标签的格式是 “key=value”,如果有多个条件,则使用这种 --filter "key1=value" --filter "key2=value"。比如:过滤没有打标签的镜像docker images -f "dangling=true",当前支持的过滤配置的key为:
$ docker rmi $(docker images -f "dangling=true" -q)
表示清理当前repo:tag为
$ 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