Docker启动和校验
# 启动Docker
systemctl start docker
# 查看Docker运行状态
systemctl status docker
# 停止Docker
systemctl stop docker
# 重启
systemctl restart docker
# 设置开机自启
systemctl enable docker
# 通过运行一个简单的 Docker 容器来验证安装是否成功:
sudo docker run hello-world
镜像和容器
镜像(image) 包含了运行所需要的环境、配置、系统级函数库。
容器(container) 运行时有自己独立的环境,可以跨系统运行,也不需要手动再次配置环境了。这套独立运行的隔离环境我们称为容器。
Docker官方提供了一些基础镜像,然后各大软件公司又在基础镜像基础上,制作了自家软件的镜像,全部都存放在这个网站。Docker镜像仓库
常见命令
注意: 可以在所有的命令后面加个 --help 获取详细用法
镜像命令 | 说明 |
---|---|
docker search | 查看镜像 |
docker pull | 拉取镜像 |
docker images | 查看本地镜像 |
docker rmi | 删除本地镜像 |
docker commit | 提交本地镜像 |
docker save | 保存镜像到本地压缩文件 |
docker load | 加载本地压缩文件到镜像 |
docker push | 推送镜像到DockerRegistry |
容器命令 | 说明 |
---|---|
docker run | 创建并运行容器(不能重复创建) |
docker stop | 停止指定容器 |
docker start | 启动指定容器 |
docker restart | 重新启动容器 |
docker rm -f | 删除指定容器 |
docker ps -a | 查看所有容器 |
docker logs | 查看容器运行日志 |
docker exec -it | 进入容器 |
docker inspect | 查看容器详细信息 |
存储
以nginx为例进行目录挂载和卷映射
目录挂载
一切以本机挂载的目录为准,初始为空目录(不存在则自动创建) 双向绑定
本机挂载以 / 开头
docker run -d -p 80:80 \
-v /app/nghtml:/usr/share/nginx/html \
--name app \
nginx:1.26.0
# 一开始访问不到欢迎页面 因为本机 /app/nghtml 目录下没有文件
cd /app/nghtml
echo hello nginx > index.html
# 输入上述命令后可以看到页面显示 hello nginx
# 进入容器内部验证双向绑定
docker exec -it app bash
cd /usr/share/nginx/html
echo hello world >> index.html
# 输入上述命令后可以看到页面显示 hello nginx hello world
卷映射
以本机的数据为准,初始同步容器内部的数据 双向绑定
卷映射不以 / 开头 直接写卷名就可以
数据卷默认放到 /var/lib/docker/volumes/目录下
docker run -d -p 80:80 \
-v /app/nghtml:/usr/share/nginx/html \
-v ngconf:/etc/nginx \
--name app1 \
nginx:1.26.0
cd /var/lib/docker/volumes/
# 可以看到目录下有ngconf文件夹
数据卷命令
命令 | 说明 |
---|---|
docker volume create | 创建数据卷 |
docker volume ls | 查看所有数据卷 |
docker volume rm | 删除指定数据卷 |
docker volume inspect | 查看某个数据卷的详情 |
docker volume prune | 清除未使用的数据卷 |
注意:容器与数据卷的挂载要在创建容器时配置,对于创建好的容器,是不能设置数据卷的。而且创建容器的过程中,数据卷会自动创建。
网络
如果在容器运行的时候没有指定网络,则自动加入docker0网络,“Gateway”: “172.17.0.1”
docker0网络 不能通过 容器名 + 端口的形式访问
网络命令
命令 | 说明 |
---|---|
docker network create | 创建一个网络 |
docker network ls | 查看所有网络 |
docker network rm | 删除指定网络 |
docker network prune | 清除未使用的网络 |
docker network connect | 使指定容器连接加入某网络 |
docker network disconnect | 使指定容器连接离开某网络 |
docker network inspect | 查看网络详细信息 |
自定义网络实现redis主从同步集群
# 1. 创建网络
docker network create redis
# 2. 主机
docker run -d -p 6379:6379 \
-v /app/rd1:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=master \
-e REDIS_PASSWORD=123456 \
--network redis --name redis01 \
bitnami/redis
# 3. 从机
docker run -d -p 6380:6379 \
-v /app/rd2:/bitnami/redis/data \
-e REDIS_REPLICATION_MODE=slave \
-e REDIS_MASTER_HOST=redis01 \
-e REDIS_MASTER_PORT_NUMBER=6379 \
-e REDIS_MASTER_PASSWORD=123456 \
-e REDIS_PASSWORD=123456 \
--network redis --name redis02 \
bitnami/redis
# 一开始启动容器会报错,因为需要写入数据 但是没有权限
cd /app
chmod -R 777 rd1
chmod -R 777 rd2
# 重启容器
docker restart redis01
docker restart redis02
DockerCompose
Docker Compose可以帮助我们实现多个相互关联的Docker容器的快速部署。
它允许用户通过一个单独的 docker-compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器。
docker-compose.yml文件的参考文档
name: myblog
services:
mysql:
container_name: mysql
image: mysql:8.0.32
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:
container_name: wordpress
image: wordpress
ports:
- "10010: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:
# 启动wordpress
docker compose -f compose.yaml up -d
# 关闭wordpress 不删除挂载的数据 下次启动数据一样
docker compose -f compose.yaml down
# 关闭wordpress 删除挂载的数据 下次启动没有数据
docker compose -f compose.yaml down -v
语法
docker compose [OPTIONS] [COMMAND]
类型 | 参数或指令 | 说明 |
---|---|---|
Options | -f | 指定compose文件的路径和名称 |
-p | 指定project名称。project就是当前compose文件中设置的多个service的集合,是逻辑概念 | |
Commands | up | 创建并启动所有service容器 |
down | 停止并移除所有容器、网络 | |
ps | 列出所有启动的容器 | |
logs | 查看指定容器的日志 | |
stop | 停止容器 | |
start | 启动容器 | |
restart | 重启容器 | |
top | 查看运行的进程 | |
exec | 在指定的运行中容器中执行命令 |