• docker笔记


    目录

    一、docker离线安装

    2.docker常用命令

    二、docker制作系统服务

    1.contes7快捷方式

    2.麒麟v10操作系统 docker快捷方式启动

    三、离线安装nginx

    四、安装mysql

    1.单点mysql

    2.主从mysql

    五、安装docker-compose

    1.从github上下载docker-compose二进制文件安装

    2.docker-compose常用命令

    六、Docker容器监控之 CAdvisor+InfluxDB+Granfana

    七、Docker轻量级可视化工具Portainer

    八、docker-compose 部署 NGINX + PHP+MySQL

    九、docker网络详解

    3. 自定义网络(推荐使用)

    4. 网络连通


    一、docker离线安装

    1.安装步骤

    1. #1. 下载 Docker 二进制文件(离线安装包)
    2. #下载地址:https://download.docker.com/linux/static/stable/x86_64/
    3. #2. 通过xftp工具将 docker-18.06.3-ce.tgz 上传到服务器上
    4. #3. 解压安装包
    5. tar zxf docker-18.06.3-ce.tgz
    6. #4. 将docker 相关命令拷贝到 /usr/bin,方便直接运行命令
    7. sudo cp docker/* /usr/bin/
    8. #5. 启动Docker守护程序
    9. sudo dockerd &
    10. #6. 验证是否安装成功,执行docker info命令,若正常打印版本信息则安装成功。
    11. docker info

    2.docker常用命令

    官网docker | Docker Documentation

    Docker容器的一些命令按功能分类大致如下

    76ed1e54c3be46449bbaff1d264a734b.png

    命令

    1. #打包
    2. docker save registry.cn-beijing.aliyuncs.com/kubesphereio/ks-apiserver:v3.3.2 > /root/ks-apiserver-v3.3.2.tar
    3. #加载包
    4. docker load -i /root/ks-apiserver-v3.3.2.tar
    5. #修改镜像名称
    6. docker tag registry.cn-beijing.aliyuncs.com/kubesphereio/ks-apiserver:v3.3.2 kubesphere/ks-apiserver:v3.3.2
    7. #删除镜像
    8. docker rmi registry.cn-beijing.aliyuncs.com/kubesphereio/ks-apiserver:v3.3.2
    9. #查看镜像
    10. docker images |grep ks-apiserver
    11. #强制删除部署的程序
    12. docker rm -f es-01
    13. #部署程序
    14. docker run -d -p 3306:3306 --privileged=true \
    15. -v /mydata/mysql/log:/var/log/mysql \
    16. -v /mydata/mysql/data:/var/lib/mysql \
    17. -v /mydata/mysql/conf:/etc/mysql/conf.d \
    18. -e MYSQL_ROOT_PASSWORD="123456" \
    19. --name mysql mysql:5.7
    20. #列出本地所有的镜像
    21. docker images -a
    22. #只显示镜像ID
    23. docker images -q
    24. #显示镜像的摘要信息
    25. docker images --digests
    26. #显示完整的镜像信息
    27. docker images --no-trunc
    28. # 从Docker Hub上查找tomcat镜像
    29. docker search tomcat
    30. # 关注度
    31. STARS:
    32. #从Docker Hub上查找关注度大于300的tomcat镜像
    33. docker search --filter=stars=300 tomcat
    34. #从Docker Hub上下载tomcat镜像,默认是最新版本。等价于:docker pull tomcat:latest
    35. docker pull tomcat
    36. # 选择指定版本下载
    37. docker pull tomcat:8
    38. #单个镜像删除,相当于:docker rmi java:latest
    39. docker rmi java
    40. #强制删除(删除正在运行的镜像,注:以后台方式运行的不能被强制删除)
    41. docker rmi -f java
    42. #多个镜像删除,不同镜像间以空格间隔
    43. docker rmi -f java tomcat nginx
    44. #删除本地全部镜像
    45. docker rmi -f $(docker images -q)
    46. # 查看正在运行的容器
    47. docker ps
    48. # 查看所有容 包括停止的容器
    49. docker ps -a
    50. # -q参数,只显示container id
    51. docker ps -q
    52. # 查看容器详细信息
    53. docker inspect demo1

    容器启动与停止

    #新建并启动容器,参数:-i  以交互模式运行容器;-t  为容器重新分配一个伪输入终端;--name  为容器指定一个名称
    docker run -i -t --name mycentos 镜像名称/镜像ID

    #后台启动容器,参数:-d  已守护方式启动容器
    docker run -d mycentos

    #启动止容器
    docker start 容器id


    # 重启容器
    docker restart 容器id


    # 关闭容器
    docker kill 容器id
    docker stop 容器id

    -t 参数让Docker分配一个伪终端并绑定到容器的标准输入上
    -i 参数则让容器的标准输入保持打开。
    -c 参数用于给运行的容器分配cpu的shares值
    -m 参数用于限制为容器的内存信息,以 B、K、M、G 为单位
    -v 参数用于挂载一个volume,可以用多个-v参数同时挂载多个volume
    -p 参数用于将容器的端口暴露给宿主机端口 格式:host_port:container_port 或者 host_ip:host_port:container_port
    --name 容器名称
    --net 容器使用的网络
    -d 创建一个后台运行容器

    容器进入与退出

    #使用run方式在创建时进入
    docker run -it centos /bin/bash


    #关闭容器并退出
    exit
    #仅退出容器,不关闭
    快捷键:Ctrl + P + Q
    快捷键:Ctrl + Shift + P + Q

    容器进程

    #top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
    #列出redis容器中运行进程
    docker top tomcat


    #查看所有运行容器的进程信息
    for i in  `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done

    容器日志

    # 查看redis容器日志,默认参数
    docker logs tomcat


    # 查看redis容器日志,参数:-f  跟踪日志输出;-t   显示时间戳;--tail  仅列出最新N条容器日志;
    docker logs -f -t --tail=20 redis


    # 查看容器redis从2021年08月10日后的最新10条日志。
    docker logs --since="2021-08-10" --tail=10 redis

    容器内拷贝文件到主机

    docker cp 容器id:容器内路径  目的主机路径

    二、docker制作系统服务
     

    1.contes7快捷方式

    1. #杀掉docker
    2. pkill -9 docker
    3. # 在 /usr/lib/systemd/system/ 目录下创建docker.service 文件
    4. cat > /usr/lib/systemd/system/docker.service <<EOF
    5. [Unit]
    6. Description=Docker Application Container Engine
    7. Documentation=https://docs.docker.com
    8. After=network-online.target firewalld.service
    9. Wants=network-online.target
    10. [Service]
    11. Type=notify
    12. ExecStart=/usr/bin/dockerd
    13. ExecReload=/bin/kill -s HUP $MAINPID
    14. LimitNOFILE=infinity
    15. LimitNPROC=infinity
    16. TimeoutStartSec=0
    17. Delegate=yes
    18. KillMode=process
    19. Restart=on-failure
    20. StartLimitBurst=3
    21. StartLimitInterval=60s
    22. [Install]
    23. WantedBy=multi-user.target
    24. EOF
    25. #添加docker仓库
    26. mkdir -p /etc/docker/
    27. cat >/etc/docker/daemon.json<<EOF
    28. {
    29. "registry-mirrors": ["https://gv33cz42.mirror.aliyuncs.com", "https://registry.docker-cn.com", "https://docker.mirrors.ustc.edu.cn", "https://dockerhub.azk8s.cn"],
    30. "exec-opts": ["native.cgroupdriver=systemd"],
    31. "max-concurrent-downloads": 20,
    32. "live-restore": true,
    33. "storage-driver": "overlay2",
    34. "max-concurrent-uploads": 10,
    35. "debug": true,
    36. "log-opts": {
    37. "max-size": "100m",
    38. "max-file": "10"
    39. }
    40. }
    41. EOF
    42. #启动
    43. systemctl daemon-reload && systemctl restart docker && systemctl enable docker && systemctl status docker|grep Active

    2.麒麟v10操作系统 docker快捷方式启动

    1. #杀掉docker
    2. pkill -9 docker
    3. cat > /usr/lib/systemd/system/docker.service <<EOF
    4. [Unit]
    5. Description=Docker Application Container Engine
    6. Documentation=https://docs.docker.com
    7. After=network-online.target firewalld.service
    8. Wants=network-online.target
    9. [Service]
    10. Type=notify
    11. ExecStart=/usr/bin/dockerd
    12. ExecReload=/bin/kill -s HUP $MAINPID
    13. LimitNOFILE=infinity
    14. LimitNPROC=infinity
    15. TimeoutStartSec=0
    16. Delegate=yes
    17. KillMode=process
    18. Restart=on-failure
    19. StartLimitBurst=3
    20. StartLimitInterval=60s
    21. [Install]
    22. WantedBy=multi-user.target
    23. EOF
    24. #启动
    25. systemctl daemon-reload && systemctl restart docker && systemctl enable docker && systemctl status docker|grep Active

    离线安装nginx

    #下载高版本nginx

    1. docker pull nginx:1.23.2
    2. #将镜像保存为本地tar文件
    3. docker save nginx:1.23.2 > /root/nginx-1.23.2.tar

    #使用load加载tar文件

    docker load -i  /root/nginx-1.23.2.tar

    #之后的文件就放这里面,对 docker 里 Nginx 对应的目录进行映射,就不用改文件进到容器里了

    1. mkdir -p /data/nginx/{conf,conf.d,html,logs}
    2. #把 nginx.conf 文件和 conf.d 里的 default.conf 复制到对应文件夹放好,后面就是修改了
    3. cat > /data/nginx/conf/nginx.conf <<EOF
    4. user nginx;
    5. worker_processes auto;
    6. error_log /var/log/nginx/error.log notice;
    7. pid /var/run/nginx.pid;
    8. events {
    9. worker_connections 1024;
    10. }
    11. http {
    12. include /etc/nginx/mime.types;
    13. default_type application/octet-stream;
    14. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
    15. '$status $body_bytes_sent "$http_referer" '
    16. '"$http_user_agent" "$http_x_forwarded_for"';
    17. access_log /var/log/nginx/access.log main;
    18. sendfile on;
    19. #tcp_nopush on;
    20. keepalive_timeout 65;
    21. #gzip on;
    22. include /etc/nginx/conf.d/*.conf;
    23. }
    24. EOF
    25. cat > /data/nginx/conf.d/default.conf <<EOF
    26. server {
    27. listen 80;
    28. listen [::]:80;
    29. server_name localhost;
    30. #access_log /var/log/nginx/host.access.log main;
    31. location / {
    32. root /usr/share/nginx/html;
    33. index index.html index.htm;
    34. }
    35. #error_page 404 /404.html;
    36. # redirect server error pages to the static page /50x.html
    37. #
    38. error_page 500 502 503 504 /50x.html;
    39. location = /50x.html {
    40. root /usr/share/nginx/html;
    41. }
    42. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    43. #
    44. #location ~ \.php$ {
    45. # root html;
    46. # fastcgi_pass 127.0.0.1:9000;
    47. # fastcgi_index index.php;
    48. # fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
    49. # include fastcgi_params;
    50. #}
    51. }
    52. EOF
    53. cat > /data/nginx/html/index.html <<EOF
    54. Welcome to nginx!
    55. nginx-v01

    56. EOF

    #部署nginx

    1. docker run --name myNginx -d -p 80:80 \
    2. -v /data/nginx/html:/usr/share/nginx/html \
    3. -v /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \
    4. -v /data/nginx/conf.d:/etc/nginx/conf.d \
    5. -v /data/nginx/logs:/var/log/nginx \
    6. -v /etc/localtime:/etc/localtime:ro \
    7. nginx:1.23.2

    安装mysql

    1.单点mysql

    1. mkdir -p /data/mysql/{log,data,conf}
    2. cat > /data/mysql/conf/my.cnf <<EOF
    3. [client]
    4. default_character_set=utf8
    5. [mysqld]
    6. socket=/var/run/mysqld/mysqld.sock
    7. collation_server = utf8_general_ci
    8. character_set_server = utf8
    9. #设置不区分大小写
    10. lower_case_table_names = 1
    11. EOF
    12. #运行
    13. docker run -d -p 3306:3306 --privileged=true \
    14. -v /data/mysql/log:/var/log/mysql \
    15. -v /data/mysql/data:/var/lib/mysql \
    16. -v /data/mysql/conf:/etc/mysql/conf.d \
    17. -v /etc/localtime:/etc/localtime:ro \
    18. -e MYSQL_ROOT_PASSWORD=123456 \
    19. --name mysql \
    20. mysql:5.7
    21. #查看
    22. docker ps |grep mysql

    #验证

    1. #进入 mysql-master
    2. docker exec -it mysql /bin/bash
    3. #登入
    4. mysql -uroot -proot
    5. #查看字符集
    6. SHOW VARIABLES LIKE 'character%';

    2.主从mysql

    a.安装 主mysql

    1. #新建目录
    2. mkdir -p /mydata/mysql-master/{log,data,conf}
    3. mkdir -p /mydata/mysql-slave/{log,data,conf}
    4. #创建主mysql
    5. docker run -d -p 3307:3306 --privileged=true \
    6. -v /mydata/mysql-master/log:/var/log/mysql \
    7. -v /mydata/mysql-master/data:/var/lib/mysql \
    8. -v /mydata/mysql-master/conf:/etc/mysql \
    9. -v /etc/localtime:/etc/localtime:ro \
    10. -e MYSQL_ROOT_PASSWORD=root \
    11. --name mysql-master \
    12. mysql:5.7.30
    13. #查看
    14. docker ps
    15. #主配置
    16. cat > /mydata/mysql-master/conf/my.cnf<<EOF
    17. [mysqld]
    18. socket=/var/run/mysqld/mysqld.sock
    19. ## 同一局域网内注意要唯一
    20. server-id=100
    21. ## 开启二进制日志功能,可以随便取(关键)
    22. log-bin=mysql-bin
    23. EOF
    24. #重启
    25. docker restart mysql-master
    26. #查看
    27. docker ps
    28. #进入 mysql-master
    29. docker exec -it mysql-master /bin/bash
    30. #登入
    31. mysql -uroot -proot
    32. #创建同步用户,授权
    33. CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
    34. GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
    35. flush privileges;
    36. #在主节点查看id
    37. show master status;

    b.安装 从mysql

    1. #新建从服务器容器实例3308
    2. docker run -d -p 3308:3306 --privileged=true \
    3. -v /mydata/mysql-slave/log:/var/log/mysql \
    4. -v /mydata/mysql-slave/data:/var/lib/mysql \
    5. -v /mydata/mysql-slave/conf:/etc/mysql \
    6. -v /etc/localtime:/etc/localtime:ro \
    7. -e MYSQL_ROOT_PASSWORD=root \
    8. --name mysql-slave \
    9. mysql:5.7.30
    10. #查看
    11. docker ps
    12. #从配置
    13. cat > /mydata/mysql-slave/conf/my.cnf<<EOF
    14. [mysqld]
    15. socket=/var/run/mysqld/mysqld.sock
    16. ## 设置server_id,注意要唯一
    17. server-id=101
    18. ## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
    19. log-bin=mysql-slave-bin
    20. ## relay_log配置中继日志
    21. relay_log=edu-mysql-relay-bin
    22. EOF
    23. #重启
    24. docker restart mysql-slave
    25. docker ps
    26. #从mysql
    27. docker exec -it mysql-slave /bin/bash
    28. #登入mysql
    29. mysql -uroot -proot
    30. #在从数据库中配置主从复制 ip填写宿主机ip
    31. change master to master_host='192.168.1.31', master_user='slave', master_password='123456', master_port=3307, master_log_file='mysql-bin.000004', master_log_pos=769, master_connect_retry=30;
    32. #在从库 开启主从同步
    33. start slave;
    34. #在从库查看状态
    35. show slave status \G;

    五、安装docker-compose

    1.从github上下载docker-compose二进制文件安装

    1. #下载
    2. sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
    3. #下面无法下载,可以去百度网盘
    4. 链接:https://pan.baidu.com/s/1qE06PjPs9547dIhsMcp9iw?pwd=u6jr
    5. 提取码:u6jr
    6. #添加可执行权限
    7. sudo chmod +x /usr/local/bin/docker-compose
    8. #测试安装结果
    9. docker-compose --version

    2.docker-compose常用命令

    1. docker-compose 命令 --help 获得一个命令的帮助
    2. docker-compose up -d nginx 构建启动nignx容器
    3. docker-compose exec nginx bash 登录到nginx容器中
    4. docker-compose down 此命令将会停止 up 命令所启动的容器,并移除网络
    5. docker-compose ps 列出项目中目前的所有容器
    6. docker-compose restart nginx 重新启动nginx容器
    7. docker-compose build nginx 构建镜像
    8. docker-compose build --no-cache nginx 不带缓存的构建
    9. docker-compose top 查看各个服务容器内运行的进程
    10. docker-compose logs -f nginx 查看nginx的实时日志
    11. docker-compose images 列出 Compose 文件包含的镜像
    12. docker-compose config 验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。
    13. docker-compose events --json nginx 以json的形式输出nginx的docker日志
    14. docker-compose pause nginx 暂停nignx容器
    15. docker-compose unpause nginx 恢复ningx容器
    16. docker-compose rm nginx 删除容器(删除前必须关闭容器,执行stop)
    17. docker-compose stop nginx 停止nignx容器
    18. docker-compose start nginx 启动nignx容器
    19. docker-compose restart nginx 重启项目中的nignx容器
    20. docker-compose run --no-deps --rm php-fpm php -v 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

    六、Docker容器监控之 CAdvisor+InfluxDB+Granfana

    1.新建目录

    mkdir /mydocker/cig

    2.新建3件套组合的 docker-compose.yml

    vim /mydocker/cig/docker-compose.yml

    1. version: '3.1'
    2. volumes:
    3. grafana_data: {}
    4. services:
    5. influxdb:
    6. image: tutum/influxdb:0.9
    7. restart: always
    8. environment:
    9. - PRE_CREATE_DB=cadvisor
    10. ports:
    11. - "8083:8083"
    12. - "8086:8086"
    13. volumes:
    14. - ./data/influxdb:/data
    15. cadvisor:
    16. image: google/cadvisor
    17. links:
    18. - influxdb:influxsrv
    19. command: -storage_driver=influxdb -storage_driver_db=cadvisor -storage_driver_host=influxsrv:8086
    20. restart: always
    21. ports:
    22. - "8080:8080"
    23. volumes:
    24. - /:/rootfs:ro
    25. - /var/run:/var/run:rw
    26. - /sys:/sys:ro
    27. - /var/lib/docker/:/var/lib/docker:ro
    28. grafana:
    29. user: "104"
    30. image: grafana/grafana
    31. user: "104"
    32. restart: always
    33. links:
    34. - influxdb:influxsrv
    35. ports:
    36. - "3000:3000"
    37. volumes:
    38. - grafana_data:/var/lib/grafana
    39. environment:
    40. - HTTP_USER=admin
    41. - HTTP_PASS=admin
    42. - INFLUXDB_HOST=influxsrv
    43. - INFLUXDB_PORT=8086
    44. - INFLUXDB_NAME=cadvisor
    45. - INFLUXDB_USER=root
    46. - INFLUXDB_PASS=root

    3.启动

    docker-compose up -d

    详细配置参考

    Docker学习22 - Docker容器监控之 CAdvisor+InfluxDB+Granfana - suphowe - 博客园

    七、Docker轻量级可视化工具Portainer

    1.部署

    docker run -d -p 8000:8000 -p 9000:9000 --name portainer     --restart=always     -v /var/run/docker.sock:/var/run/docker.sock     -v portainer_data:/data     portainer/portainer

    2.选择local选项卡后本地docker详细信息展示

    八、docker-compose 部署 NGINX + PHP+MySQL

    1.创建数据文件夹

    1. mkdir /data
    2. cd /data
    3. mkdir -p mysql/conf.d
    4. mkdir -p mysql/data
    5. mkdir -p nginx/conf.d
    6. mkdir -p nginx/log
    7. mkdir -p php/conf.d
    8. mkdir www


    2.nginx配置文件

    1. sudo docker run --name nginx -d nginx
    2. #复制出来配置文件:
    3. sudo docker cp nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf.d/

    3.创建php的Dockerfile:

    cat /data/php/Dockerfile

    1. FROM php:7.4-fpm
    2. RUN apt-get update && apt-get install -y \
    3. libfreetype6-dev \
    4. libjpeg62-turbo-dev \
    5. libpng-dev \
    6. libvpx-dev libwebp-dev \
    7. && docker-php-ext-configure gd --with-webp=/usr/include/webp --with-jpeg=/usr/include --with-freetype=/usr/include/freetype2 \
    8. && docker-php-ext-install -j$(nproc) gd \
    9. && docker-php-ext-install mysqli \
    10. && docker-php-ext-install pdo_mysql

    #打包镜像

    docker build -t myphp:1.0 ./

    4.复制出php的配置文件

    1. sudo docker run --name php -d myphp:1.0
    2. sudo docker cp php:/usr/local/etc/php/php.ini-production php/conf.d/php.ini

    5.修改nginx/conf.d/default.conf

    cat /data/nginx/conf.d/default.conf

    1. server {
    2. listen 80;
    3. listen [::]:80;
    4. server_name localhost;
    5. #access_log /var/log/nginx/host.access.log main;
    6. location / {
    7. root /usr/share/nginx/html;
    8. index index.php index.html index.htm;
    9. }
    10. #error_page 404 /404.html;
    11. # redirect server error pages to the static page /50x.html
    12. #
    13. error_page 500 502 503 504 /50x.html;
    14. location = /50x.html {
    15. root /usr/share/nginx/html;
    16. }
    17. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    18. location ~ \.php$ {
    19. root /usr/share/nginx/html;
    20. fastcgi_pass compose-php:9000;
    21. fastcgi_index index.php;
    22. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    23. fastcgi_param SCRIPT_NAME $fastcgi_script_name;
    24. include fastcgi_params;
    25. }
    26. # deny access to .htaccess files, if Apache's document root
    27. # concurs with nginx's one
    28. #
    29. #location ~ /\.ht {
    30. # deny all;
    31. #}
    32. }

    6.复制数据库的配置文件

    1. docker run --name mysql -d mysql:5.7
    2. docker cp mysql:/etc/mysql/conf.d /data/mysql/

    6.1删除之前部署的进程

    1. docker kill $(docker ps -a |grep mysql)
    2. docker kill $(docker ps -a |grep php)
    3. docker kill $(docker ps -a |grep nginx)
    4. docker rm $(docker ps -a |grep mysql)
    5. docker rm $(docker ps -a |grep php)
    6. docker rm $(docker ps -a |grep nginx)

    7. cat /data/docker-compose.yaml

    1. version: "3"
    2. services:
    3. nginx:
    4. image: nginx:latest
    5. container_name: "compose-nginx"
    6. restart: always
    7. ports:
    8. - "80:80"
    9. - "443:443"
    10. environment:
    11. - TZ=Asia/Shanghai
    12. depends_on:
    13. - "php"
    14. volumes:
    15. - "/data/nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf"
    16. - "/data/nginx/log:/var/log/nginx"
    17. - "/data/www:/usr/share/nginx/html"
    18. networks:
    19. - net-app
    20. php:
    21. image: myphp:1.0
    22. container_name: "compose-php"
    23. restart: always
    24. environment:
    25. - TZ=Asia/Shanghai
    26. volumes:
    27. - "/data/www:/usr/share/nginx/html"
    28. - "/data/php/conf.d/php.ini:/usr/local/etc/php/php.ini"
    29. networks:
    30. - net-app
    31. mysql:
    32. image: mysql:5.7
    33. container_name: "compose-mysql"
    34. environment:
    35. MYSQL_ROOT_PASSWORD: root
    36. MYSQL_USER: admin
    37. MYSQL_PASSWORD: admin
    38. volumes:
    39. - ./mysql/data:/var/lib/mysql
    40. - ./mysql/conf.d:/etc/mysql/conf.d
    41. networks:
    42. - net-app
    43. networks:
    44. net-app:

    8.启动

    cd /data/

    #启动
    docker-compose up -d
    #停止
    docker-compose stop
    #卸载
    docker-compose down

    9.浏览器访问

    1. echo ''> www/info.php
    2. curl http://localhost/info.php

    或浏览器打开访问

    10.连接数据库:

    sudo docker run -it --network data_net-app mysql:5.7 mysql -uroot -proot -hcompose-mysql

    博客参考:https://blog.csdn.net/shelutai/article/details/125082697

    九、Docker网络详解

    1. Docker网络模式

    Docker默认提供了3种网络模式,生成容器时不指定网络模式下默认使用bridge桥接模式。

    1. [root@haha docker_web]# docker network ls
    2. NETWORK ID NAME DRIVER SCOPE
    3. aa8a26ae1484 bridge bridge local
    4. 62cd016ed66a host host local
    5. fc650e2a675e none null local

    1.1 host模式

    如果启动容器时使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。

    使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
     

    Namespace的简要说明:
    Docker使用了Linux的Namespaces技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等。
    一个Network Namespace提供了一份独立的网络环境,包括网卡、路由、Iptable规则等都与其他的NetworkNamespace隔离。一个Docker容器一般会分配一个独立的Network Namespace。

    1.2 container模式

    这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信
    1.3 none模式

    使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过–network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
    1.4 bridge模式

    bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。bridge模式如下图所示:
     

    32f8d4aa4b6e409883a3ad722148ed08.png

    当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器都会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

    从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。
    1160022e5102464ab2d88f919608c6ea.png

    959aaf01334e4caf8999be1026e349eb.png

    从上图中我们可以看到,可以看到容器内部和Linux主机都会创建一个新的网卡,而这两个网卡都是成对的。使用的技术就是evth-pair。evth-pair 就是一对的虚拟设备接口,他们是成对出现的,一段连着协议,一段彼此相连。evth-pair充当一个桥梁,连接各种虚拟网络设备。

    Docker容器完成bridge网络配置的过程如下:
    1. 在主机上创建一对虚拟网卡veth pair设备。veth设备总是成对出现的,它们组成了一个数据的通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备。
    2. Docker将veth pair设备的一端放在新创建的容器中,并命名为eth0。另一端放在主机中,以vethb22db1b4这样类似的名字命名,并将这个网络设备加入到docker0网桥中。
    3. 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。
     

       宿主机和Docker容器之间是可以进行网络连接的,同样的,Docker容器和容器之间也可以直接进行网络连接

    1. [root@haha docker_web]# docker exec -it a52bd646da1f ping 172.17.0.2
    2. PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    3. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.193 ms
    4. 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.134 ms
    5. 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.132 ms
    6. [root@haha docker_web]# docker exec -it 386ffc29485d ping 172.17.0.3
    7. PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
    8. 64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.146 ms
    9. 64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.073 ms
    10. 64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.137 ms

    容器1和容器2,都使用公用的路由器docker0。所有的容器在不指定网络情况下,都是由docker0路由的,Docker会给我们容器默认分配一个随机的可用IP地址,这些IP地址之间是可以进行网络交互的,交互模型图如下:

    0593c4b8a2d64b75aef6502a5c132e87.png

    2. 容器互联

    在微服务部署的场景下,注册中心是使用服务名来唯一识别微服务的,而我们上线部署的时候微服务对应的IP地址可能会改动,所以我们需要使用容器名来配置容器间的网络连接。使–link可以完成这个功能。

    首先不设置–link的情况下,是无法通过容器名来进行连接的。centos02容器是可以直接ping通centos01的容器ip,但是无法ping通centos01的容器name:
     

    1. [root@haha ~]# docker ps
    2. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    3. c742968a290a 5d0da3dc9764 "/bin/bash" 9 seconds ago Up 8 seconds centos02
    4. 581740709b5e 5d0da3dc9764 "/bin/bash" 30 seconds ago Up 28 seconds centos01
    5. [root@haha ~]#
    6. [root@haha ~]# docker exec -it centos01 ip addr
    7. 1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    8. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    9. inet 127.0.0.1/8 scope host lo
    10. valid_lft forever preferred_lft forever
    11. 34: eth0@if35: mtu 1500 qdisc noqueue state UP group default
    12. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    13. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
    14. valid_lft forever preferred_lft forever
    15. [root@haha ~]#
    16. [root@haha ~]# docker exec -it centos02 ping 172.17.0.2
    17. PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
    18. 64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.102 ms
    19. 64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.135 ms
    20. 64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.137 ms
    21. [root@haha ~]#
    22. [root@haha ~]# docker exec -it centos02 ping centos01
    23. ping: centos01: Name or service not known

    添加参数 –link,可以通过容器name进行连接。centos03容器link到centos01,所以centos03可以直接通过ping centos01的容器名去ping通,但是反过来centos01去ping centos03的容器名是ping不通的。

    1. [root@haha ~]# docker run -d -P -it --name centos03 --link centos01 5d0da3dc9764
    2. a66f059fe26da45e5c59af03a2c33f429452a2dcf884ad5826fa0e3985ab3862
    3. [root@haha ~]# docker ps
    4. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    5. a66f059fe26d 5d0da3dc9764 "/bin/bash" 7 seconds ago Up 5 seconds centos03
    6. c742968a290a 5d0da3dc9764 "/bin/bash" 11 minutes ago Up 11 minutes centos02
    7. 581740709b5e 5d0da3dc9764 "/bin/bash" 11 minutes ago Up 11 minutes centos01
    8. [root@haha ~]#
    9. [root@haha ~]# docker exec -it centos03 ping centos01
    10. PING centos01 (172.17.0.2) 56(84) bytes of data.
    11. 64 bytes from centos01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.111 ms
    12. 64 bytes from centos01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.074 ms
    13. 64 bytes from centos01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.076 ms
    14. ^C
    15. [root@haha ~]#
    16. [root@haha ~]# docker exec -it centos01 ping centos03
    17. ping: centos03: Name or service not known

    –link的原理就是在centos03容器的hosts文件中添加了要去link的centos01容器的容器名和ip地址映射。但是因为docker0不支持容器名访问,所以–link设置容器互连的方式也不再推荐使用了,更多地选择自定义网络。

    01bddcf9967f441caf56a7460dcb1d24.png

    3. 自定义网络(推荐使用)

    docker network 命令及经常使用到的命令:

    docker network --help
    

     e82394fc119a4916aaa54a7c263efae0.png

     如何自定义一个网络?

    docker network create --help

    86f33f32c2a04fdc93bbc162f1256688.png

    具体使用:

    1. [root@haha ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    2. ed1c176a06d49da31969e229138ef5988a5fd9d2b2f2d2fc5ec1078be99a3d39
    3. [root@haha ~]# docker network ls
    4. NETWORK ID NAME DRIVER SCOPE
    5. aa8a26ae1484 bridge bridge local
    6. 62cd016ed66a host host local
    7. ed1c176a06d4 mynet bridge local
    8. fc650e2a675e none null local

    查看新创键的mynet详细信息:

    49780c37c8024cdf98eb8be1476075c9.png

    使用自定义网络创建容器后,相同网络name下的容器,不管是通过容器IP还是容器name,都可以进行网络通信

    1. # 创建两个使用相同自定义网络的容器
    2. [root@haha ~]# docker run -d -P --name centos-net-01 --net mynet -it 5d0da3dc9764 /bin/bash
    3. [root@haha ~]# docker run -d -P --name centos-net-02 --net mynet -it 5d0da3dc9764 /bin/bash
    4. [root@haha ~]#
    5. [root@haha ~]# docker ps
    6. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    7. 2511566dd5f3 5d0da3dc9764 "/bin/bash" 4 seconds ago Up 3 seconds centos-net-02
    8. 924e92107f64 5d0da3dc9764 "/bin/bash" 23 seconds ago Up 21 seconds centos-net-01
    9. a66f059fe26d 5d0da3dc9764 "/bin/bash" 43 minutes ago Up 43 minutes centos03
    10. c742968a290a 5d0da3dc9764 "/bin/bash" 54 minutes ago Up 54 minutes centos02
    11. 581740709b5e 5d0da3dc9764 "/bin/bash" 55 minutes ago Up 55 minutes centos01
    12. # 测试容器互连
    13. [root@haha ~]# docker exec -it centos-net-01 ping centos-net-02
    14. PING centos-net-02 (192.168.0.3) 56(84) bytes of data.
    15. 64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.689 ms
    16. 64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.078 ms
    17. 64 bytes from centos-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.097 ms
    18. ^C
    19. [root@haha ~]# docker exec -it centos-net-01 ping 192.168.0.2
    20. PING 192.168.0.2 (192.168.0.2) 56(84) bytes of data.
    21. 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.091 ms
    22. 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.048 ms
    23. 64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.094 ms
    24. ^C

    4. 网络连通

    在没有使用connect命令的情况下,不同网络间的容器是无法进行网络连接的。

    21f78f07a78640b1b4ef563c95bf7ec0.png

    74bb4a0815be45eb8b3b99f5ef0c2bfd.png

    不同Docker网络之间的容器想要连接的话,需要把该容器注册到另一个容器所在的网络上,使用docker connect命令。

     docker network connect mynet centos01
    

    connect设置成功后,我们可以看到新注册进来的容器信息:

    ad67fbf3ed4e44c898ace4e63a45d5a7.png

    接下来进行容器双向连接测试:

    1. # centos-net-01 ping centos01,连接成功
    2. [root@haha ~]# docker exec -it centos-net-01 ping centos01
    3. PING centos01 (192.168.0.4) 56(84) bytes of data.
    4. 64 bytes from centos01.mynet (192.168.0.4): icmp_seq=1 ttl=64 time=0.183 ms
    5. 64 bytes from centos01.mynet (192.168.0.4): icmp_seq=2 ttl=64 time=0.139 ms
    6. 64 bytes from centos01.mynet (192.168.0.4): icmp_seq=3 ttl=64 time=0.136 ms
    7. ^C
    8. # centos01 ping centos-net-01,连接成功
    9. [root@haha ~]# docker exec -it centos01 ping centos-net-01
    10. PING centos-net-01 (192.168.0.2) 56(84) bytes of data.
    11. 64 bytes from centos-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.066 ms
    12. 64 bytes from centos-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.135 ms
    13. 64 bytes from centos-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.141 ms
    14. ^C
    15. [root@haha ~]# 未连接到mynet的容器还是无法访问
    16. [root@haha ~]# docker exec -it centos-net-01 ping centos02
    17. ping: centos02: Name or service not known

    感谢狂神B站提供的教程:https://www.bilibili.com/video/BV1og4y1q7M4

    感谢高过蓝天Docker网络详解_高过蓝天的云的博客-CSDN博客

  • 相关阅读:
    数据结构--队列与循环队列的实现
    HTML学生作业网页 传统端午节节日 学生节日网页设计作业源码(HTML+CSS+JS)
    微服务架构学习与思考
    通用后台管理系统前端界面Ⅴ——axios使用与封装、配置路由和路由懒加载
    计算机的组成部件的作用
    并发之CAS
    SpringCloudAlibaba微服务分布式架构
    Java基础 - 重写(Override)与重载(Overload)
    基于SSM的医院挂号管理系统
    LeetCode 1361. 验证二叉树【二叉树,DFS或BFS或并查集】1464
  • 原文地址:https://blog.csdn.net/qq_35583325/article/details/127849408