docker学习

devtools/2024/10/9 13:34:06/

一、centos安装docker

本实验是以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; 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)下载镜像

相关命令

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

相关命令

# 运行
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)保存镜像

相关命令

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

 使用卷映射启动

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目录下。可以理解为使用目录映射时,容器内部以外部目录为准,使用卷映射时,外部目录以容器内部目录为准。

查看所有卷:

docker volume ls

查看卷的详情

docker volume inspect volumename

 查看某个容器的细节

docker container inspect [app01]

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

创建网络

docker network create mynet

列出网络

docker network ls

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

docker run -d -p 80:80 --name app02 --network mynet nginx

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

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

三、redis主从同步集群

 使用如下镜像bitnima/redis

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

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 发现没有正常运行

[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

查看容器的日志

[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

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

chmod -R 777 /app

 重新启动

docker restart 50c

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

接下来,启动从节点slave:

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
[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容器

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

 

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

# 创建网络
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文件

name: myblog
services:mysql:container_name: mysqlimage: mysql:8.0ports:- "3306:3306"environment:- MYSQL_ROOT_PASSWORD=123456- MYSQL_DATABASE=wordpressvolumes:- mysql-data:/var/lib/mysql- /app/myconf:/etc/mysql/conf.drestart: alwaysnetworks:- blogwordpress:image: wordpressports:- "8080:80"environment:WORDPRESS_DB_HOST: mysqlWORDPRESS_DB_USER: rootWORDPRESS_DB_PASSWORD: 123456WORDPRESS_DB_NAME: wordpressvolumes:- wordpress:/var/www/htmlrestart: alwaysnetworks:- blogdepends_on:- mysqlvolumes:mysql-data:wordpress:networks:blog:

 使用docker compose 批量启动

# 删除运行的容器
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关闭应用

docker compose -f compose.yaml down

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

docker compose -f compose.yaml down --rmi all -v

 六、制作镜像Dockerfile

常用指令:

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

查看镜像层级:

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


http://www.ppmy.cn/devtools/120388.html

相关文章

Python Selenium常用语法汇总(包含XPath语法)

Python 的 Selenium 库是一个强大的工具&#xff0c;用于自动化浏览器操作&#xff0c;常用于网页测试、爬虫等场景。下面是一些常用的 Selenium 语法和操作方法总结&#xff1a; 1. 安装 Selenium 和 WebDriver 首先&#xff0c;你需要安装 Selenium 库以及对应的 WebDriver…

Qt C++设计模式->外观模式

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;提供了一个统一的接口&#xff0c;用来访问子系统中的一群接口。外观模式通过定义一个高级接口&#xff0c;使得子系统更加容易使用&#xff0c;避免了客户端直接与子系统的复杂交互。 外观模…

PHP爬虫:获取商品SKU详细信息的艺术

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是每个商品的唯一标识符&#xff0c;它包含了商品的详细信息&#xff0c;如尺寸、颜色、价格等。对于商家和开发者来说&#xff0c;获取商品的SKU详细信息对于库存管理、订单…

旅游避坑指南

1.火车站旁白的小摊贩&#xff0c;还有周边的小饭店百分之百是黑店&#xff0c;不仅难吃要死而且巨黑&#xff01;&#xff01;&#xff01; 可以地图上搜索附近的大型商超&#xff0c;例如泰安市的银座商超&#xff0c;里面的东西不仅好吃而且价格透明&#xff0c;还有很多当…

easyExcel使用模版填充excel,合并单元格

一、最终效果 二、制作模版 1、制作填充模版 模版在代码中保存的位置 2、Controller /*** 下载模板*/ RequestMapping(value "exportData") public void exportData(KqKqb kqKqb,HttpServletResponse response, HttpServletRequest request) throws IOExceptio…

【STM32单片机_(HAL库)】4-3-1【定时器TIM】串口打印功能打开

1.硬件 STM32单片机最小系统CH340模块 2.软件 main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "uart1.h"int main(void) {HAL_Init(); /* 初始化HAL库 */stm32_clock_init(R…

《蓝桥杯算法入门》(C/C++、Java、Python三个版本)24年10月出版

推荐&#xff1a;《算法竞赛》&#xff0c;算法竞赛大全书&#xff0c;网购&#xff1a;京东 天猫  当当 文章目录 《蓝桥杯算法入门》内容简介本书读者对象作者简介联系与交流《蓝桥杯算法入门 C/C》版目录 《蓝桥杯算法入门 Java》版目录 《蓝桥杯算法入门 Python》版目录 …

5G 随机接入那点事

文章目录 竞争模式非竞争模式 和LTE 一样 5G 也的RA&#xff08;Random access&#xff09;模式也分为以下两种。 竞争模式 基于竞争模式的随机接入&#xff08;Contention Based Random Access&#xff0c;CBRA&#xff09;,由于接入前导序列是由UE 从SIB1广播的PRACH 信道资…