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