常用命令

# 查看docker版本
docker version
# 如下命令显示有关Docker安装的系统范围信息。显示的信息包括内核版本、容器数量和镜像数量。
docker info
# 查看帮助信息
docker help
# 查看某具体命令的帮助信息
docker COMMAND --help
# 例如:
docker run --help
# 显示容器资源使用统计信息的实时流
docker stats

使用镜像

# 查询镜像
docker search [OPTIONS] TERM
# 例如:
docker search tomcat

# 拉取镜像
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
# 例如,拉取最新版本的tomcat镜像:
docker pull tomcat
# 拉取指定版本的tomcat镜像:
docker pull tomcat:9.0

# 列出所有镜像
docker images

容器管理

# 基于指定镜像运行一个容器(相当于docker create之后再docker start)
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 例如:
docker run --name myTomcat -d -p 8888:8080 tomcat
# 运行一个容器时可以指定的选项非常多,例如上面通过“--name myTomcat”指定容器名称为“myTomcat”,
# “-d”表示:在后台运行容器并打印容器ID
# “-p 8888:8080”表示:将容器的端口(8080)发布到主机(8888),之后访问就使用主机的ip加8888端口访问
# 除此之外,还有如下常用选项:
# -a  用于在创建容器时绑定到容器的STDIN、STDOUT或STDERR。这使得可以根据需要操纵输出和输入。
# 例如:
docker run --name myStdOut -a stdout ubuntu echo heihei
# 然后查看日志,即可看到“heihei”
docker logs myStdOut
# -e  设置环境变量
docker run -d -e NGINX_ENTRYPOINT_QUIET_LOGS=1 nginx
# -i  即使未连接上,也保持标准输入是打开的,常与-t一起使用
# -t  分配一个伪终端
# 例如:
docker run -it ubuntu
root@c3afdbe94451:/# ls
bin  boot  dev  etc  home  lib  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@c3afdbe94451:/# exit
exit
# --link  添加指向另一个容器的链接(目前已过时,可能会在将来的版本中删除)
# 建议用用户定义的网络来达成容器间的通信,但是用户定义网络无法解决的问题是在容器间共享变量,
# 但是可以通过其他机制如数据卷来实现这一目的。
# -m  内存限制
# --net  将容器连接到网络,假设我们已经通过docker network create创建了名为elastic的网络
docker run -d --name myEs --net elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.14.1
# --network  将容器连接到网络(此功能应该与--net一样,只是使用方式略有不同,暂未找到二者差异的官方解释)
docker run -d --name myEs --network=elastic -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.14.1
# --restart	 容器退出时要应用的重新启动策略,默认是no,即docker引擎重启后,不会自动重启该容器
# 设定redis永远自动启动
docker run --restart=always redis
# --rm  当容器退出时自动将其移除
docker run -it --rm ubuntu
# 上述命令执行后,通过exit命令退出,然后使用docker ps -a查看容器,发现没有该容器
# -v  绑定并挂载卷,如下示例分步骤进行
# 1. 先启动一个tomcat容器
docker run -d --name myTomcat -p 8080:8080 tomcat
# 2. 将容器内的tomcat目录复制到主机的当前目录
docker cp f92f91b17878:/usr/local/tomcat ./
# 3. 此时,我们访问8080端口,拿到的是Tomcat的404,原因是webapps内是空的,然后我们将webapps.dist目录下的内容复制到webapps目录下
cp -r webapps.dist/* webapps
# 4. 启动一个新tomcat,并将主机上的tomcat目录挂载到容器的/usr/local/tomcat目录
docker run -d --name myTomcat02 -p 8081:8080 -v /Users/hongmao/docker-data/tomcat:/usr/local/tomcat tomcat
# 此时,访问8081端口,就可以发现不再是404了,而是我们常见的tomcat首页
# 此处可以理解为:容器内的/usr/local/tomcat目录就是主机上的/Users/hongmao/docker-data/tomcat目录
# 例如,我们现在在主机的tomcat/webapps目录下新建hello/index.html,其内容如下:
# <!DOCTYPE html>
# <html>
#    <body>Hello World!</body>
# </html>
# 保存后,访问localhost:8081/hello即可以看到:Hello World!
# 容器记录的日志也可以通过主机上的logs目录下的文件实时查看,日志文件是由容器中的服务在容器中写入的
cat logs/localhost_access_log.2021-10-03.txt
# 如果想让数据卷内的文件只能在主机上修改,而不能在容器中修改,则可以通过ro来设置,如下:
docker run  -v /xxx/tomcat/conf:/usr/local/tomcat/conf:ro tomcat
# 挂载数据卷时注意如下几点:
# 1. 尽量主机和容器的路径都写绝对路径(容器的路径如果非绝对路径会报错,主机的路径如果非绝对路径则会在其他位置创建目录而非你期望的那样)
# 2. 指定的主机上的目录如果不存在时会自动创建

# 列出运行中的容器
docker ps
# 列出所有容器
docker ps -a

# 查看某个容器的详细信息
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
# 例如:
docker inspect myTomcat

# 停止一个容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 例如,关闭id为aa46d59fb05f的容器:
docker stop aa46d59fb05f
# 也可以基于名称关闭容器
docker stop myTomcat

# 启动一个(已存在的)容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 例如,关闭id为aa46d59fb05f的容器:
docker start aa46d59fb05f
# 也可以基于名称启动容器
docker start myTomcat

# 在正在运行的容器中运行命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
# 创建一个运行中容器的bash会话
docker exec -it myTomcat /bin/bash
# 在一个运行中的容器中执行命令:ls
docker exec -it myTomcat ls

# 查看某容器的端口映射关系
docker port CONTAINER [PRIVATE_PORT[/PROTO]]
# 例如,查看名为myTomcat的容器的端口映射关系
docker port myTomcat
8080/tcp -> 0.0.0.0:8080
docker port myTomcat 8080
0.0.0.0:8080

# 修改容器名
docker rename CONTAINER NEW_NAME
# 例如:
docker rename my_container my_new_container

# 在容器和本地文件系统之间复制文件/文件夹,例如,将id为300ff1e3077b容器内的文件复制到本地文件系统
docker cp 300ff1e3077b:/usr/local/tomcat ./
# 反过来也是可行的,即将本地文件系统的文件复制到容器中
docker cp ./ 300ff1e3077b:/usr/local/tomcat

# 删除一个或多个容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 例如:删除id为867c42bf1d7a的容器:
docker rm 867c42bf1d7a

Docker网络管理

# 列出所有docker网络
docker network ls

# 创建一个网络
docker network create [OPTIONS] NETWORK
# 例如:
docker network create elastic
# 在上述不指定驱动时,默认为bridge,也可以按如下方式指定驱动
docker network create -d bridge my-bridge-network

# 将运行中的容器连接到网络
docker network connect [OPTIONS] NETWORK CONTAINER
# 例如:
docker network connect my-network container1

# 将容器的网络断开
docker network disconnect [OPTIONS] NETWORK CONTAINER
# 例如:
docker network disconnect my-network container1

# 查看网络的详细信息
docker network inspect [OPTIONS] NETWORK [NETWORK...]
# 例如:
docker network inspect bridge

# 删除所有未使用的网络
docker network prune [OPTIONS]
# 强制删除未使用的网络,这样不会再询问是否确认删除
docker network prune -f

# 删除指定网络
docker network rm NETWORK [NETWORK...]
# 例如:
docker network rm my-bridge-net