Docker日常开发使用

Section1.容器操作

Section1.1.如何将容器保存为镜像

1
$ docker commit -m <Version Description> -a <Author> <容器ID|容器名称> <组织名称>/<镜像名称>:<版本号>

Section1.2.如何查看容器前10行实时日志?

1
$ docker logs -f -t --tail 10 <容器ID|容器名称>

Section1.3.如何批量删除所有已停止运行的容器

方式有很多,来看一种比较常见也比较好理解的方式:

1
$ docker rm `docker ps -a | grep "Exited" | awk '{print $1}'`

Section1.4.容器环境如何使用宿主机网络

容器环境没有梯子你是访问不了Github的,那么在宿主机已经搬了一把梯子,这个时候你就不用再在Docker容器搬梯子了,只需要让Docker容器环境内的网络使用宿主机网络环境就可以了,你需要在运行容器时加上 –network 选项,值为 host 即可:

1
$ docker run -it --privileged=true -d --name=centos --network host centos:8 /bin/bash

Docker容器运行的时候有host、bridge、none三种网络可供配置。默认是bridge,即桥接网络,以桥接模式连接到宿主机;host是宿主网络,即与宿主机共用网络;none则表示无网络,容器将无法联网。

Section2.镜像操作

Docker镜像你可以把它理解为系统光盘,这个比喻其实非常的贴切,系统光盘可以装多台机器(你别跟我抬杠哦),镜像也可以启动多个容器,记住了,镜像是基础。当然再不要脸一点可以把它理解为面向对象中的类,那与之对应的容器就是一个一个的实例了。

Section2.1.如何批量删除为none的镜像?

1
$ docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

Section2.2.如何提交镜像到DockerHub

1
$ docker push <组织名称>/<镜像名称>:<版本号>

Section2.3.如何删除多个镜像使用相同镜像ID的镜像

多个镜像如下:

1
2
3
4
$ docker images | grep "feiba/"
feiba/rocky          1.1.0      53aab0bc4443   About an hour ago   1.41GB
feiba/rocky-test     1.0.0      034ad52d7665   2 hours ago         754MB
feiba/rocky          1.0.0      034ad52d7665   2 hours ago         754MB

这时使用镜像ID进行删除Docker镜像

1
2
$ docker rmi 034ad52d7665
Error response from daemon: conflict: unable to delete 034ad52d7665 (cannot be forced) - image has dependent child images

这个时候使用镜像ID是白瞎了,那该怎么做为,为什么会出现这种情况?

先说一下为什么会出现这种情况,原因也非常简单,那就是现在这个 034ad52d7665 镜像ID同时有两个镜像在使用,通过这个共用的镜像ID去删除镜像,Docker为了安全考虑是不允许我们这样操作的,我们需要像下面这样的方式,通过镜像以及版本号一个一个的删除。

1
2
$ docker rmi feiba/rocky-test:1.0.0
Untagged: feiba/rocky-test:1.0.0

这个时候 feiba/rocky-test:1.0.0 这个Docker镜像也就删除了。另一个 feiba/rocky:1.0.0 Docker镜像也以同样的方式进行删除。

1
2
3
$ docker rmi feiba/rocky:1.0.0
Untagged: feiba/rocky:1.0.0
Untagged: feiba/rocky@sha256:e0ea484b734e6072527d041e4b455623ad35d77687a035ddc9c43b07eab7793b

3.如何查看docker现在有多少网卡?

1
$ docker network ls

4.如何删除docker网卡?

1
$ docker network rm <Network ID | Name>

5.如何查看当前容器占用多少内存?

1
$ docker ps -s

6.使用docker-compose管理工具运行容器时,发现孤儿容器如何解决?

1
WARNING: Found orphan containers (wmx_redis_server) for this project. If you removed or renamed this service in your compose file, you can run this command with the --remove-orphans flag to clean it up.

这个是因为如果您有两个相同的项目名称的时候,docker这个时候就在创建容器并运行的时候它办不了了,它不知道是该如何管理这个将要创建的容器和之前创建的容器了,比如您呢之前有一个用于管理个人博客的redis容器,这个容器从docker.redis项目目录启动并运行了,而现在呢您又有一个管理公司项目的redis容器,而启动这个redis容器的目录恰恰也叫docker.redis,这个时候就会报错启动不成功,它让您呢在启动的时候可以加上 --remove-orphans 选项,将之前的删除掉,您可千万别执行哈,这也不是我们想要的结果不是吗,我们可以使用 docker-compose -h 看到有一个 -p, --project-name NAME 选项,好了,就是它,它的英文注释是:Specify an alternate project name,中文意思嘛,就是:指定替代项目名称,这个替代项目名称,您可以随意起名,一般呢以域名为基础进行命令即可,具体命令如下:

1
$ docker-compose -p helloshaohua-com-docker-redis -f docker-compose.yaml up -d

这个时候就可以成功启动了!

7.如何进入容器内部?

1
$ docker exec -it <CONTAINER ID | Name> bash
  • -i: 是保持容器内的shell与宿主主机之间互动。您如果不加 -i 选项呢,您输入一个 echo 'hello world'; 它没有输出哦~,它也就没有与宿主主机之间保持互动,容器内部它确实是执行了,感观上您看不到它的执行!
  • -t: 分配一个基础的shell命令行!
comments powered by Disqus