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 |
| Image ID |
| Image repository |
| Image tag |
| Image digest |
| Elapsed time since the image was created |
| Time when the image was created |
| Image disk size |
$ docker images -q
这个其实跟 docker images --format "{{.ID}}" 效果是一样的,是只展示ID