Docker 精通之常用命令

Docker 精通系列

配置文件路径

/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

这个是进行对展示的进行格式化话展示

PlaceholderDescription
.IDImage ID
.RepositoryImage repository
.TagImage tag
.DigestImage digest
.CreatedSinceElapsed time since the image was created
.CreatedAtTime when the image was created
.SizeImage disk size

$ docker images -q

这个其实跟 docker images --format "{{.ID}}" 效果是一样的,是只展示ID

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值