Skip to content

Docker

  • 镜像 Image
  • 容器 Container
  • 数据卷 Volume
sh
docker pull nginx                       # 拉取 nginx 镜像
docker images                           # 查看所有镜像
docker save -o ./nginx.tar nginx:latest # 导出 nginx 镜像
docker rmi nginx:latest                 # 删除 nginx 镜像
docker load -i ./nginx.tar              # 加载 nginx 镜像

# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# -p Publish a container's port(s) to the host
docker run --detach --name nginx -p 80:80 nginx # 创建容器
docker ps [-a]                                  # 查看 (所有) 容器
docker start nginx                              # 启动 nginx 容器
docker logs --follow nginx                      # 查看 nginx 容器的日志

# 拉取mysql镜像并创建mysql容器
docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=0228 mysql

# docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker start nginx         # 启动 nginx 容器
# -i, --interactive; -t, --tty A pseudo-TTY
docker exec -it nginx bash # 进入 nginx 容器
docker stop mysql          # 终止 nginx 容器
docker rm mysql [--force]  # 删除 nginx 容器

# -v, --volume Bind mount a volume
docker run -d --name nginx -p 80:80 -v html:/usr/share/nginx/html nginx
docker volume ls           # 列出所有数据卷
docker volume inspect html # 查看 html 数据卷
docker volume rm html      # 删除 html 数据卷
docker volume prune        # 删除未使用的数据卷
# ========== MacOS ==========
# docker run -it --privileged --pid=host debian nsenter -t 1 -m -u -n -i sh
# cd /var/lib/docker/volumes

# ========== Windows ==========
# cd \\wsl$\docker-desktop-data\data\docker\volumes

docker inspect nginx # 查看 nginx 的镜像, 容器, 数据卷

docker run -d --name mysql -p 3306:3306 -e TZ=Asia/Shanghai -e MYSQL_ROOT_PASSWORD=0228 \
-v ./volume/mysql/data:/var/lib/mysql \
-v ./volume/mysql/init:/docker-entrypoint-initdb.d \
-v ./volume/mysql/conf:/etc/mysql/conf.d mysql # 挂载 mysql

docker run -d --name nginx -p 80:80 -v ~/volume/nginx/html:/usr/share/nginx/html nginx # 挂载nginx

Dockerfile

指令说明
FROM指定基础镜像FROM openjdk:21-jdk-slim-buster
ENV设置环境变量ENV key=value
COPY拷贝文件到容器的指定目录COPY ./a.tar.gz /tmp/
RUN执行 shell 命令RUN tar -xzf /tmp/a.tar.gz
ENTRYPOINT启动命令ENTRYPOINT
sh
cd ~/demo && ls # Dockerfile demo.jar
cat ./Dockerfile
# FROM openjdk:21-jdk-slim-buster
# ENV TZ=Asia/Shanghai
# RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
# COPY ./demo.jar /app.jar
# ENTRYPOINT ["java", "-jar", "/app.jar"]

docker build -t demo:1.0 ./ # docker build -t demo:1.0 /home/user/demo
docker images
docker run -d --name demo -p 8080:8080 demo:1.0
docker ps -a
curl localhost:8080/hello
  • 网桥: 网段内转发
  • 路由器: 网段间转发

默认网络 bridge

sh
docker inspect nginx | grep -i Gateway   # 172.17.0.1/16
docker inspect nginx | grep -i IPAddress # 172.17.0.2/16

docker inspect mysql | grep -i Gateway   # 172.17.0.1/16
docker inspect mysql | grep -i IPAddress # 172.17.0.3/16

ping -c 4 172.17.0.1                     # Success

默认网络 bridge

命令说明
docker network create [OPTIONS] NETWORK创建某网络
docker network ls列出所有网络
docker network inspect [OPTIONS] NETWORK [NETWORK...]查看某网络
docker network rm NETWORK [NETWORK...]删除某容器
docker network prune删除未使用的网络
docker network connect [OPTIONS] NETWORK CONTAINER某容器加入某网络
docker network disconnect [OPTIONS] NETWORK CONTAINER某容器离开某网络
sh
docker network ls
docker network inspect bridge  # "Name": "bridge", "Gateway": "172.17.0.1"

docker network create segment
docker network inspect segment # "Name": "segment", "Gateway": "172.18.0.1"

docker network connect segment mysql
docker inspect mysql | grep -i IPAddress # 172.17.0.3, 172.18.0.2

docker network disconnect bridge mysql
docker inspect mysql | grep -i IPAddress # 172.18.0.2

docker rm -f nginx
# 创建 nginx 容器时指定网络
docker run -d --name nginx -p 80:80 -v ~/volume/nginx/html:/usr/share/nginx/html --network segment nginx
docker exec -it nginx bash

# apt update && apt install inetutils-ping net-tools
ping -c 4 172.18.0.2 # Success
ping -c 4 mysql      # Success
shell
# RabbitMQ
docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:latest