跳到主要内容

docker命令

wsargent/docker-cheat-sheet: Docker Cheat Sheet (github.com)

容器

Lifecycle

命令说明例子
docker createcreates a container but does not start it.docker create --name myubuntu ubuntu
docker renameallows the container to be renamed.docker rename oldname newname
docker runcreates and starts a container in one operation.docker run --name mynginx -p 80:80 -d nginx
docker rmdeletes a container.docker rm mycontainer
docker updateupdates a container's resource limits.docker update --cpu-shares 512 mycontainer

docker run: 通常,如果您不使用任何选项运行容器,它将立即启动并停止。如果您想保持其运行状态,可以使用命令docker run -td container_id -t 选项来分配一个伪终端会话,-d选项自动分离容器(在后台运行容器并打印容器 ID)。

如果您想要一个临时容器,docker run --rm 将在停止后移除容器。在运行mysql客户端的时候,可以使用该参数 docker run -it --rm mysql:5.7 mysql -h172.17.0.2 -uroot -p

如果您想将主机上的目录映射到 Docker 容器中 docker run -v $HOSTDIR:$DOCKERDIR

如果您想删除与容器关联的卷,删除容器必须包括参数-v, docker rm -v

在 Docker 1.10 中,还提供了针对单个容器的日志驱动程序。要使用自定义日志驱动程序(例如 syslog)运行 Docker 。使用命令 docker run --log-driver=syslog

另一个有用的选项是 --name,因为当您在运行命令中指定时名称,这将允许您通过使用创建容器时指定的名称来启动和停止容器。

Starting and Stopping

命令说明例子
docker startstarts a container so it is running.docker start mycontainer
docker stopstops a running container.docker stop mycontainer
docker restartstops and starts a container.docker restart mycontainer
docker pausepauses a running container, "freezing" it in place.docker pause mycontainer
docker unpausewill unpause a running container.docker unpause mycontainer
docker waitblocks until running container stops.docker wait mycontainer
docker killsends a SIGKILL to a running container.docker kill mycontainer
docker attachwill connect to a running container.docker attach mycontainer

Info

命令说明例子
docker psshows running containers.docker ps
docker logsgets logs from container. (Available for json-file and journald in 1.10)docker logs -f mycontainer
docker inspectlooks at all the info on a container (including IP address).docker inspect mycontainer
docker eventsgets events from container.docker events
docker portshows public facing port of container.docker port mycontainer
docker topshows running processes in container.docker top mycontainer
docker statsshows containers' resource usage statistics.docker stats
docker diffshows changed files in the container's filesystem.docker diff mycontainer

docker ps -a显示正在运行和已停止的容器。

docker stats --all 显示所有容器的列表,默认只显示正在运行的。

Import / Export

命令说明例子
docker cpcopies files or folders between a container and the local filesystem.docker cp mycontainer:/path/to/file /local/path
docker exportturns container filesystem into a tarball archive stream to STDOUT.docker export my_container | gzip > my_container.tar.gz

Executing Commands

命令说明例子
docker execto execute a command in container.docker exec -it foo /bin/bash

要进入一个正在运行的容器,将一个新的 shell 进程附加到名为 foo 的运行中的容器上,使用docker exec -it foo /bin/bash

Image

Lifecycle

命令说明例子
docker imagesshows all images.docker images
docker importcreates an image from a tarball.cat my_container.tar.gz | docker import - my_image:my_tag
docker buildcreates image from Dockerfile.docker build -t myimage:0.0.1 .
docker commitcreates image from a container, pausing it temporarily if it is running.docker commit mycontainer mynewimage
docker rmiremoves an image.docker rmi myimage
docker image prune清除未使用的镜像
docker loadloads an image from a tar archive as STDIN, including images and tags (as of 0.7).docker load < my_image.tar.gz
docker savesaves an image to a tar archive stream to STDOUT with all parent layers, tags & versions (as of 0.7).docker save my_image:my_tag | gzip > my_image.tar.gz

export importsave load区别?

  • export 导出丢失镜像所有的历史记录和元数据信息。

    docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用,比如作为基础的开发环境。

  • save 保存没有丢失镜像的历史,可以回滚到之前的层。

    docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使用 docker load 载入。

Info

命令说明例子
docker historyshows history of an image.docker history myimage
docker tagtags an image to a name (local or registry).docker tag myimage myregistry/myimage:mytag

NetWorks

安装 Docker 时,它会自动创建 3 个网络接口(桥接、主机、无网络)。

  • bridge

如果不指定,新创建的容器默认将连接到bridge网络。 默认情况下,新的容器会启动到桥接网络中,宿主机可以ping通容器ip,容器中也能ping通宿主机。容器之前只能通过ip地址相互访问,由于容器的ip会随着启动的顺序发生变化,因此不推荐使用ip访问。

docker run -it --rm busybox 可以使用该命令去进入一个busybox容器,该容器连接到默认网络中,可以使用ping命令测试其他容器,和宿主机的连通。

  • host

容器与宿主主机共享网络,不需要映射端口即可通过宿主主机IP访问。主机模式网络可用于优化性能,在容器需要处理大量端口的情况下,它不需要网络地址转化(NAT),并且不会为每个端口创建“用户空间代理”。

  • none

禁用容器中的所有网络,在启动容器时使用。

Lifecycle

命令说明例子
docker network createCreate a new network (default type: bridge).docker network create --driver bridge mynetwork
docker network rmRemove one or more networks by name or identifier.docker network rm mynetwork

Info

命令说明例子
docker network lsList networksdocker network ls
docker network inspectDisplay detailed information on one or more networks.docker network inspect mynetwork

Connection

命令说明例子
docker network connectConnect a container to a networkdocker network connect mynetwork mycontainer
docker network disconnectDisconnect a container from a networkdocker network disconnect mynetwork mycontainer

docker network create my-net 创建一个网络。 docker network connect my-net innolight-blazor 将创建的网络和容器相连接,

image.png

如果docker run 直接使用--network 之后,将不会添加默认的网络。

数据存储

将数据存储在容器中,一旦容器被删除,数据也会被删除。同时也会使容器变得越来越大,不方便恢复和迁移。 将数据存储到容器之外,这样删除容器也不会丢失数据。一旦容器故障,我们可以重新创建一个容器,将数据挂载到容易里,就可以快速的恢复。

存储方式

Docker 提供了以下存储选项

  • volumn 卷存储在主机文件系统分配一块专有存储区域,由Docker(在Linux上)管理,并且与主机的核心功能隔离。非 Docker 进程不能修改文件系统的这一部分。卷是在 Docker 中持久保存数据的最佳方式。

数据卷的优势:

  1. 卷可以在多个正在运行的容器之前共享数据,仅当显示删除卷时,才会删除卷。
  2. 当你想将容器数据存储在外部网络存储上或者云提供商上,而不是本地。
  3. 卷更容易备份或者迁移,当你需要备份,还原数据或者将数据从一个Docker主机前提到另一个Docker主机时,卷是更好的选择。
  • bind mount 绑定挂载 绑定挂载可以将主机文件系统上目录或文件装载到容器中,但是主机上的非 Docker 进程可以修改它们,同时在容器中也可以更改主机文件系统,包括创建、修改或删除文件或目录,使用不当,可能会带来安全隐患。

绑定挂载适用场景:

  1. 将配置文件从主机共享到容器
  2. 在Docker主机上的开发环境和容器之前共享源代码或者编译目录。
  • tmpfs 临时挂载 tmpfs挂载仅存储在主机系统的内存中,从不写入主机系统的文件系统。当容器停止时数据将被删除,

docker run -d -it --tmpfs /tmp nginx:1.22-alpine

Bind Mount

docker run --name some-mysql -v D:/mysql/config/mysql.cnf:/etc/mysql/conf.d/mysql.cnf:ro -v D:/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7

使用该命令,创建一个mysql容器,并且指定配置文件D盘的mysq/config/mysql.cnf 和数据为D盘mysq/data

docker exec some-mysql -it /bin/bash 来确定下配置项。

Volumes

Docker 卷是自由浮动的文件系统。它们不必连接到特定的容器。您可以使用从数据容器挂载的卷来实现可移植性。从 Docker 1.9.0 开始,Docker 引入了命名卷,取代了数据容器。考虑使用命名卷来实现,而不是数据容器。

因为卷是隔离的文件系统,所以它们经常被用来存储临时容器之间的计算状态。也就是说,你可以从一个配方中运行一个无状态的临时容器,然后将其删除,然后再次创建一个临时容器的实例,从上一个容器停止的地方继续执行。

Lifecycle

命令说明例子
docker volume createCreate a new volume.docker volume create myvolume
docker volume rmRemove one or more volumes.docker volume rm myvolume

Info

命令说明例子
docker volume lsList all volumes.docker volume ls
docker volume inspectDisplay detailed information on one or more volumes.docker volume inspect myvolume

Exposing ports

-p 参数使得容器端口映射到主机端口(仅使用本地主机接口)。

docker run -p 127.0.0.1:$HOSTPORT:$CONTAINERPORT \
--name CONTAINER \
-t someimage

您可以使用 EXPOSE 在运行时告诉 Docker 容器监听指定的网络端口

EXPOSE <CONTAINERPORT>

请注意,本身不会暴露端口 - 只有会这样做。