Bootstrap

Docker使用教程

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镜像仓库

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的集合,是逻辑概念
Commandsup创建并启动所有service容器
down停止并移除所有容器、网络
ps列出所有启动的容器
logs查看指定容器的日志
stop停止容器
start启动容器
restart重启容器
top查看运行的进程
exec在指定的运行中容器中执行命令
;