Docker - 快速通关 (3h) (yuque.com)
本文参考该文档进行修改完善
一、Docker安装
-
安装指南:
[Install Docker Engine on CentOS | Docker Docs](https://docs.docker.com/engine/install/centos/)
-
安装文档:
# 移除旧版本docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-engine # 配置docker yum源。 sudo yum install -y yum-utils sudo yum-config-manager \ --add-repo \ http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo # 安装 最新 docker sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin # 启动Docker sudo systemctl start docker # 启动& 开机启动docker; enable + start 二合一 systemctl enable docker --now # 配置加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
二、常见的Docker命令
-
镜像操作
#搜索镜像 docker search nginx #下载镜像 docker pull nginx #下载指定版本镜像 tag是指版本 docker pull nginx:1.26.0 #查看所有镜像 docker images #删除指定id的镜像 docker rmi <IMAGE ID> #eg:docker rmi e784f4560448
-
容器操作
#查看运行中的容器 docker ps #查看所有容器 docker ps -a #查看所有容器的id docker ps -aq #运行一个新容器 docker run nginx #docker run详细讲解 docker run --help # docker run [OPTIONS] IMAGE [COMMAND] [ARG...] # 后台启动容器 docker run -d --name mynginx nginx # 后台启动并暴露端口 docker run -d --name mynginx -p 88:80 nginx #将容器的80端口映射到本机的88端口。原本的80端口是指容器内部的操作系统的80端口,但记得要在安全组策略中开放端口 #停止容器 docker stop <NAME> #启动容器 docker start <CONTAINER ID> #重启容器 docker restart <CONTAINER ID> #查看容器资源占用情况 docker stats <CONTAINER ID> #查看容器日志 docker logs <CONTAINER ID> #删除指定容器 docker rm <CONTAINER ID> #强制删除指定容器 docker rm -f <CONTAINER ID> docker rm -f $(docker ps -aq) # 进入容器内部 docker exec -it <NAME> /bin/bash
-
容器打包镜像
# 提交容器变化打成一个新的镜像 docker commit -m "update index.html" <NAME> <NEW NAME>:<tag> # 保存镜像为指定文件 docker save -o <文件名称> <NAME> #ps:docker save -o mynginx.tar mynginx:v1.0 # 删除多个镜像 docker rmi <CONTAINER ID> <CONTAINER ID> <CONTAINER ID> docker rmi bde7d154a67f 94543a6c1aef e784f4560448 # 加载镜像 docker load -i <文件名称> #ps:docker load -i mynginx.tar
-
镜像推送社区
# 登录 docker hub docker login # 重新给镜像打标签 docker tag <NAME> <NEW NAME> docker tag mynginx:v1.0 leifengyang/mynginx:v1.0 # 推送镜像 docker push leifengyang/mynginx:v1.0
三、端口映射
四、文件存储
-
目录挂载
-
目录挂载是将宿主机上的一个目录挂载到容器中的某个目录。这意味着容器可以直接访问和修改宿主机上的文件系统。
- 优点:
- 简单直观:只需指定宿主机目录和容器目录即可。
- 性能好:由于直接访问宿主机文件系统,性能较高。
- 实时同步:任何对宿主机目录的更改都会立即反映在容器中,反之亦然。
- 缺点:
- 依赖宿主机文件系统:如果宿主机目录被删除或改变,容器可能会失效。
- 安全性问题:容器可以访问宿主机文件系统,可能带来安全隐患。
- 优点:
-
docker run指令:
-v <宿主机文件路径>:<容器内部文件路径>
完整指令:
docker run -d -p 8080:80 -v /app/nghtml:/usr/share/nginx/html --name app01 nginx
-
-
卷映射
-
数据卷是 Docker 提供的一种更高级的数据持久化方法。数据卷完全由 Docker 管理,不依赖于宿主机的具体文件系统路径。
- 优点:
- 独立于宿主机:数据卷的管理独立于宿主机文件系统,可以在不同宿主机之间迁移。
- 持久化:容器删除后,数据卷中的数据仍然保留。
- 备份和迁移:容易备份和迁移数据卷。
- 安全性:与宿主机隔离,提供更高的安全性。
- 缺点:
- 管理复杂度:需要通过 Docker 命令或配置文件管理数据卷。
- 性能可能略低:由于隔离层,可能会有轻微的性能开销。
- 优点:
-
docker run指令:
-v <数据卷名>:<容器内部文件路径>
完整指令:
docker run -d -p 8080:80 -v ngconf:/etc/nginx --name app01 nginx
-
数据卷目录:
/var/lib/docker/volumes/<volume-name>
-
数据卷常见命令:
# 查看数据卷 docker volume ls # 删除数据卷 docker volume rm # 查看数据卷详情 docker volume inspect <数据卷名> # 删除未使用的数据卷 docker volume prune #查看容器挂载了哪些数据卷 docker inspect <容器名>
-
-
比较总结
- 目录挂载适用于需要直接访问宿主机文件系统的场景,如开发调试,或需要高性能的场景。
- 数据卷适用于生产环境,尤其是需要数据持久化、备份和迁移的场景。
五、Docker容器通信
-
Docker基本通信原理:docker为每个容器分配唯一ip,使用容器ip+容器端口 可以互相访问,但是ip由于各种原因可能会变化
-
自定义网络常见指令:
#创建自定义网络 docker network create my_custom_network #创建两个容器并连接到自定义网络 docker run -d --name container1 --network my_custom_network nginx docker run -d --name container2 --network my_custom_network nginx #验证容器间通信 docker exec -it container1 ping container2
六、Docker Compose
-
官方文档:https://docs.docker.com/compose/compose-file/
-
顶级元素:
-
示例文件
name: myblog services: mysql: container_name: mysql image: mysql:8.0 ports: - "3306:3306" environment: - MYSQL_ROOT_PASSWORD=123456 - MYSQL_DATABASE=wordpress volumes: - mysql-data:/var/lib/mysql - /app/myconf:/etc/mysql/conf.d restart: always networks: - blog wordpress: image: wordpress ports: - "8080:80" environment: WORDPRESS_DB_HOST: mysql WORDPRESS_DB_USER: root WORDPRESS_DB_PASSWORD: 123456 WORDPRESS_DB_NAME: wordpress volumes: - wordpress:/var/www/html restart: always networks: - blog depends_on: - mysql volumes: mysql-data: wordpress: networks: blog:
-
docker compose启动:在yaml文件的根目录下
docker compose -f compose.yaml up -d
-d
:表示后台方式-f
:表示文件名compose.yaml
-
关闭:
docker compose down
七、Dockerfile
- 常见指令
-
示例Dockerfile
FROM openjdk:17 #基础环境 LABEL author=leifengyang #标签 COPY app.jar /app.jar #复制文件 EXPOSE 8080 #暴露端口 ENTRYPOINT ["java","-jar","/app.jar"] #执行指令
-
制作镜像
- 指令:
docker build -f Dockerfile -t myjavaapp:v1.0 .
-f
:镜像文件-t
:镜像名称.
:表示宿主机工作目录
- 指令: