docker学习

一、centos安装docker

本实验是以centos操作系统。

bash 复制代码
# 移除旧版本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; enable + start 二合一
systemctl enable docker --now

# 配置加速
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://mirror.ccs.tencentyun.com"
    ]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

# 使用命令查看是否正确启动
docker ps

二、使用docker部署nginx

使用docker部署nginx,修改主页,进行发布。

(1)下载镜像

相关命令

bash 复制代码
# 检索
docker search nginx # 这个命令我在腾讯云服务器上执行,获取不到结果,弄了半天也没弄好
# 下载
docker pull
# 列表
docker images
# 删除
docker rmi
(2)启动容器

相关命令

bash 复制代码
# 运行
docker run
# 查看
docker ps -a
# 停止
docker stop
# 启动
docker start
# 重启
docker restart
# 状态
docker stats
# 日志
docker logs
# 进入
docker exec
# 删除
docker rm
# 后台启动
docker run -d --name mynginx -p 80:80 nginx
# 交互进入容器
docker exec -it mynginx bash
# 进入到指定目录
cd /usr/share/nginx/html
# 修改index.html
(3)保存镜像

相关命令

bash 复制代码
# 提交
docker commit
# 保存
docker save -o mynginx.tar mynginx:v1.0
# 加载
docker load -i mynginx.tar
(4)分享社区
bash 复制代码
# 登录
docker login
# 打标签
docker tag oldname yourname/newname
# 推送
docker push yourname/newname

使用卷映射启动

bash 复制代码
docker run -d --name app03 -p 90:80 -v ngconf:/etc/nginx -v /app/nghtml:/usr/share/nginx/html nginx

使用卷映射,可以避免在使用目录映射时,由于外部目录为空,导致映射到容器内部也为空,使得容器启动失败。当然,可以先在外部建立好相关映射目录和文件,再使用目录映射。另外一种方法是使用卷映射,卷映射也是使用-v参数,但是不同点是卷映射不以"/"开头,而是直接使用自定义的卷名。映射之后,这个卷名在外部/var/lib/docker/volumes目录下。可以理解为使用目录映射时,容器内部以外部目录为准,使用卷映射时,外部目录以容器内部目录为准。

查看所有卷:

bash 复制代码
docker volume ls

查看卷的详情

bash 复制代码
docker volume inspect volumename

查看某个容器的细节

bash 复制代码
docker container inspect [app01]

通过上面的命令,可以看到指定容器在内部的网络地址。

创建网络

bash 复制代码
docker network create mynet

列出网络

bash 复制代码
docker network ls

启动容器,加入自定义网络

bash 复制代码
docker run -d -p 80:80 --name app02 --network mynet nginx

绑定自定义的网络之后,就可以使用容器名进行稳定的访问

bash 复制代码
# 进入容器
docker exec -it app02 bash
curl http://app02:80

三、redis主从同步集群

使用如下镜像bitnima/redis

使用bitnami创建容器创建主节点master:

bash 复制代码
docker run -d -p 6379:6379 -v /app/rd1:/bitnami/redis/data -e REDIS_REPLICATION_MODE=master -e REDIS_PASSWORD=123456 --network mynet --name redis01 bitnami/redis

创建完之后,使用docker ps -a 发现没有正常运行

bash 复制代码
[root@VM-24-5-centos ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS                      PORTS                               NAMES
50cdd220d951   bitnami/redis   "/opt/bitnami/script..."   48 seconds ago   Exited (1) 47 seconds ago                                       redis01
981cb63c6752   mynginx:v1.0    "/docker-entrypoint...."   45 minutes ago   Up 45 minutes               0.0.0.0:80->80/tcp, :::80->80/tcp   app02

查看容器的日志

bash 复制代码
[root@VM-24-5-centos ~]# docker logs 50c
redis 16:20:05.04 INFO  ==>
redis 16:20:05.04 INFO  ==> Welcome to the Bitnami redis container
redis 16:20:05.04 INFO  ==> Subscribe to project updates by watching https://github.com/bitnami/containers
redis 16:20:05.04 INFO  ==> Submit issues and feature requests at https://github.com/bitnami/containers/issues
redis 16:20:05.04 INFO  ==> Upgrade to Tanzu Application Catalog for production environments to access custom-configured and pre-packaged software components. Gain enhanced features, including Software Bill of Materials (SBOM), CVE scan result reports, and VEX documents. To learn more, visit https://bitnami.com/enterprise
redis 16:20:05.04 INFO  ==>
redis 16:20:05.04 INFO  ==> ** Starting Redis setup **
redis 16:20:05.06 INFO  ==> Initializing Redis
redis 16:20:05.06 INFO  ==> Setting Redis config file
redis 16:20:05.08 INFO  ==> Configuring replication mode
redis 16:20:05.10 INFO  ==> ** Redis setup finished! **

redis 16:20:05.11 INFO  ==> ** Starting Redis **
1:C 27 Sep 2024 16:20:05.126 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
1:C 27 Sep 2024 16:20:05.126 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 27 Sep 2024 16:20:05.126 * Redis version=7.4.0, bits=64, commit=00000000, modified=1, pid=1, just started
1:C 27 Sep 2024 16:20:05.126 * Configuration loaded
1:M 27 Sep 2024 16:20:05.126 * monotonic clock: POSIX clock_gettime
1:M 27 Sep 2024 16:20:05.127 * Running mode=standalone, port=6379.
1:M 27 Sep 2024 16:20:05.127 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1:M 27 Sep 2024 16:20:05.127 * Server initialized
1:M 27 Sep 2024 16:20:05.127 # Can't open or create append-only dir appendonlydir: Permission denied

大概的意思就是所映射的文件夹该容器没有权限访问,将映射到主机的目录的权限进行修改。

bash 复制代码
chmod -R 777 /app

重新启动

bash 复制代码
docker restart 50c

再次查看,发现容器正常启动了。

接下来,启动从节点slave:

bash 复制代码
docker run -d -p 6380:6379 -v /app/rd1:/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 mynet --name redis02 bitnami/redis
bash 复制代码
[root@VM-24-5-centos ~]# docker ps
CONTAINER ID   IMAGE           COMMAND                   CREATED          STATUS          PORTS                                       NAMES
b3e51d271341   bitnami/redis   "/opt/bitnami/script..."   27 seconds ago   Up 26 seconds   0.0.0.0:6380->6379/tcp, :::6380->6379/tcp   redis02
50cdd220d951   bitnami/redis   "/opt/bitnami/script..."   14 minutes ago   Up 11 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis01
981cb63c6752   mynginx:v1.0    "/docker-entrypoint...."   59 minutes ago   Up 59 minutes   0.0.0.0:80->80/tcp, :::80->80/tcp           app02

然后使用vscode的redis插件或者redis客户端进行连接,如果使用腾讯云服务器进行连接,需要先开放对应的端口,否则链接失败。

向主机或者从机写入数据,另外一个会进行数据同步:

四、启动MySQL容器

bash 复制代码
docker run -d -p 3306:3306 -v /app/myconf:/etc/mysql/conf.d -v /app/mydata:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0.37-debian

五、使用docker compose

下面是使用命令行的方式启动

bash 复制代码
# 创建网络
docker network create blog
# 查看网络是否创建成功
docker network ls
# 批量删除之前的容器
docker rm -f $(docker ps -aq)
# 创建MySQL容器
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE
=wordpress -v mysql-data:/var/lib/mysql -v /app/myconf:/etc/mysql/conf.d --restart always --name my
sql --network blog mysql:8.0
# 启动WordPress
docker run -d -p 8080:80 -e WORDPRESS_DB_HOST=mysql -e WORDPRESS_DB_USER=root -e WORDPRESS_DB_PASSWORD=123456 -e WORDPRESS_DB_NAME=wordpress -v wordpress:/var/www/html --restart always --name wordpress-app --network blog wordpress:latest

浏览器访问ip:8080

配置完毕之后使用配置的账号和密码进入后台:

使用compose进行管理:

参考文档:Compose file reference | Docker Docs

使用compose的方式启动,编辑compose.yaml文件

bash 复制代码
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 批量启动

bash 复制代码
# 删除运行的容器
docker rm -f $(docker ps -aq)
# 删除之前的卷
docker volume rm mysql-data wordpress
# 删除之前的网络
docker network rm blog
# 使用compose启动
docker compose -f compose.yaml up -d

# 输出如下
[+] Running 5/5
 ✔ Network myblog_blog           Created                                                      0.0s
 ✔ Volume "myblog_mysql-data"    Created                                                      0.0s
 ✔ Volume "myblog_wordpress"     Created                                                      0.0s
 ✔ Container mysql               Started                                                      0.3s
 ✔ Container myblog-wordpress-1  Started                                                      0.5s

网络名和卷名都会拼接一个name作为前缀。如果没有给定容器名,则拼接后缀添加数字作为区分。另外,如果compose.yaml文件做了修改,那么再次使用上面的compose启动命令,compose会自动判断应用是否发生变化,如果发生变化才会进行更新,重新启动,如果没有变化,则保持原样。

使用compose关闭应用

bash 复制代码
docker compose -f compose.yaml down

上述命令会关闭应用,并删除网络,但是不会删除卷,也就是数据会被保存。如果要移除镜像,并且删除卷,可以使用如下命令:

bash 复制代码
docker compose -f compose.yaml down --rmi all -v

六、制作镜像Dockerfile

常用指令:

|------------|-----------|
| FROM | 指定镜像基础环境 |
| RUN | 运行自定义命令 |
| CMD | 容器启动命令或参数 |
| LABEL | 自定义标签 |
| EXPOSE | 指定暴露端口 |
| ENV | 环境变量 |
| ADD | 添加文件到镜像 |
| COPY | 复制文件到镜像 |
| ENTRYPOINT | 容器固定启动命令 |
| VOLUME | 容器数据卷 |
| USER | 指定用户和用户组 |
| WORKDIR | 指定默认工作目录 |
| ARG | 指定构建参数 |

查看镜像层级:

bash 复制代码
docker image history mynginx:v1.0
IMAGE          CREATED        CREATED BY                                       SIZE      COMMENT
5227c77e8efb   36 hours ago   nginx -g daemon off;                             1.12kB    update index.html
<missing>      6 weeks ago    CMD ["nginx" "-g" "daemon off;"]                 0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    STOPSIGNAL SIGQUIT                               0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    EXPOSE map[80/tcp:{}]                            0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    ENTRYPOINT ["/docker-entrypoint.sh"]             0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    COPY 30-tune-worker-processes.sh /docker-ent...   4.62kB    buildkit.dockerfile.v0
<missing>      6 weeks ago    COPY 20-envsubst-on-templates.sh /docker-ent...   3.02kB    buildkit.dockerfile.v0
<missing>      6 weeks ago    COPY 15-local-resolvers.envsh /docker-entryp...   336B      buildkit.dockerfile.v0
<missing>      6 weeks ago    COPY 10-listen-on-ipv6-by-default.sh /docker...   2.12kB    buildkit.dockerfile.v0
<missing>      6 weeks ago    COPY docker-entrypoint.sh / # buildkit           1.62kB    buildkit.dockerfile.v0
<missing>      6 weeks ago    RUN /bin/sh -c set -x     && groupadd --syst...   113MB     buildkit.dockerfile.v0
<missing>      6 weeks ago    ENV DYNPKG_RELEASE=2~bookworm                    0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    ENV PKG_RELEASE=1~bookworm                       0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    ENV NJS_RELEASE=1~bookworm                       0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    ENV NJS_VERSION=0.8.5                            0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    ENV NGINX_VERSION=1.27.1                         0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    LABEL maintainer=NGINX Docker Maintainers <d...   0B        buildkit.dockerfile.v0
<missing>      6 weeks ago    /bin/sh -c #(nop)  CMD ["bash"]                  0B
<missing>      6 weeks ago    /bin/sh -c #(nop) ADD file:a9a95cfab16803be0...   74.8MB

参考资料:Docker - 快速通关 (3h) · 语雀

参考视频:最新版3小时速通Docker入门到项目实战【完整版】附配套资料+笔记_哔哩哔哩_bilibili

相关推荐
啦啦右一1 分钟前
前端 | MYTED单篇TED词汇学习功能优化
前端·学习
霍格沃兹测试开发学社测试人社区29 分钟前
软件测试学习笔记丨Flask操作数据库-数据库和表的管理
软件测试·笔记·测试开发·学习·flask
今天我又学废了1 小时前
Scala学习记录,List
学习
王俊山IT1 小时前
C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(5)
开发语言·c++·笔记·学习
Mephisto.java2 小时前
【大数据学习 | kafka高级部分】kafka中的选举机制
大数据·学习·kafka
南宫生2 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
武子康3 小时前
大数据-212 数据挖掘 机器学习理论 - 无监督学习算法 KMeans 基本原理 簇内误差平方和
大数据·人工智能·学习·算法·机器学习·数据挖掘
使者大牙4 小时前
【大语言模型学习笔记】第一篇:LLM大规模语言模型介绍
笔记·学习·语言模型
As977_4 小时前
前端学习Day12 CSS盒子的定位(相对定位篇“附练习”)
前端·css·学习
ajsbxi4 小时前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet