1:dorcker的安装
https://kdocs.cn/l/cu3AAe4nDrp8
也可以参考官网 https://docs.docker.com/engine/install/centos/
1.1:移除旧版本
sudo yum remove docker*
1.2:设置docker yum源 设置aliyun比较快
sudo yum install -y yum-utils --安装一些必要的工具,防止安装出错
sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
1.3:安装最新docker engine
sudo yum install docker-ce docker-ce-cli containerd.io
1.4:也可以安装指定版本docker engine
#找到所有可用docker版本列表
yum list docker-ce --showduplicates | sort -r
-----------
docker-ce.x86_64 3:23.0.1-1.el7 docker-ce-stable
docker-ce.x86_64 3:23.0.0-1.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.9-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.8-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.7-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.6-3.el7 docker-ce-stable
docker-ce.x86_64 >>> 3:20.10.5-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.4-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.3-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.24-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.2-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.23-3.el7 docker-ce-stable
docker-ce.x86_64 3:20.10.22-3.el7 docker-ce-stable
-----
# 安装指定版本,用上面的版本号替换<VERSION_STRING> 3:20.10.5-3.el7
sudo yum install docker-ce-<VERSION_STRING>.x86_64 docker-ce-cli-
<VERSION_STRING>.x86_64 containerd.io
#例如:
#yum install docker-ce-3:20.10.5-3.el7.x86_64 docker-ce-cli-3:20.10.5-
3.el7.x86_64 containerd.io
#注意加上 .x86_64 大版本号
1.5: 启动服务
systemctl start docker
systemctl enable docker
1.6: 配置镜像加速 这样拉取镜像会快一些
/etc/docker/daemon.json 是Docker的核心配置文件。
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://hz0oi0rk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload 重启后台进程
sudo systemctl restart docker 重启docker
2:Dcoker基本命令 https://docs.docker.com/reference/
2.1 拉取镜像 仓库镜像地址(https://hub.docker.com/_/redis/tags)
docker redis 等同不指定为最新版本 docker pull redis:latest
拉取指定版本镜像 docker pull redis:alpine3.19
2.2 容器的状态
Created(新建)、Up(运行中)、Pause(暂停)、Exited(退出)
2.3 查看镜像
docker images
-----------------------------
镜像名 标签 镜像id 镜像创建时间 大小
REPOSITORY TAG IMAGE ID CREATED SIZE
redis alpine3.19 eac30ee4acc6 2 days ago 46.1MB 推荐
redis latest 7614ae9453d1 2 years ago 113MB
# 镜像是怎么做成的。基础环境+软件
redis的完整镜像应该是: linux系统+redis软件
alpine:超级经典版的linux 5mb;+ redis = 29.0mb
没有alpine3的:就是centos基本版
# 以后自己选择下载镜像的时候尽量使用
alpine: slim:
[root@master ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23fd411b24d3 redis "docker-entrypoint.s…" 24 seconds ago Exited (0) 2 seconds ago relaxed_jepsen
2.4 删除容器id
docker rm 23fd411b24d3
2.5 删除镜像
docker rmi redis
2.6 强制删除镜像(镜像有引用使用时无法删除,f强制删除)
docker rmi -f redis
2.7 删除所有镜像
docker rmi $(docker ps -aq) # docker images -aq 获取所有镜像id
docker rmi -f $(docker image ls -q) 同上
2.8 删除所有容器
docker rm -f $(docker images -aq)
2.9 查看运行中的容器
docker ps
2.10查看所有状态的容器,运行中,停止
docker ps -a
2.11 修改镜像名字 docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
docker tag nginx:latest my_nginx:latest
# my_nginx latest 605c77e624dd 2 years ago 141MB
# nginx latest 605c77e624dd 2 years ago 141MB
2.12 容器的重启策略
#重启策略:
--restart=always 总是重启
--restart=no 不重启
--restart=on-failure 失败后重启(默认重启 5 次)
--restart=on-failure:3 失败后重启(自定义最大重启次数,例如 3 次)
--restart=unless-stopped 未手动停止则重启
未指定容器可以用docker update a35526we --restart=always 去更新容器的重启策略
2.13 移除游离镜像 (没有镜像名字的)
docker image prune
2.14 创建容器 启动容器 暂停容器 停止容器 恢复容器
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
#创建一个redis容器
容器名 端口绑定:宿主机:容器内 镜像名
docker create --name my_redis -p 6379:6379 redis
#启动
docker start fd2ead81c584
#暂停
docker pause fd2ead81c584
#优雅停止
docker stop fd2ead81c584
#恢复暂停状态
docker unpause fd2ead81c584
#强制停止
docker kill -9 fd2ead81c584
2.15 容器停止后自动删除
docker run -d --rm --name myredis2 -p 6379:6379 redis
2.16 容器后台运行
-d后台运行 等同于上面
docker create + docker start
2.17 容器端口
-P 大写P 随机端口
docker run -d --rm --name myredis2 -P redis
docker run -d --rm --name myredis2 -p 6379:6379 redis
2.18 查看容器日志
docker logs -f fd2ead81c584
docker logs -n 2 fd2ead81c584 后2行日志
docker attached fd2ead81c584 #绑定控制台 不推荐
2.19 容器的运行方式
-i 交互模式
-t 伪终端
-u 用户 (可选)
--privileged (扩展权限 特权方式)
docker exec -it -u 0:0 --privileged my_redis /bin/bash
2.20 查看容器和镜像详细信息
#查看容器详情
docker container inspect 容器名 等同于 docker inspect 容器名
docker inspect fd2ead81c584
#查看镜像详情
docker inspect image redis
2.21 容器的cp 和 diff 和commit
#复制
复制宿主机文件到容器
docker cp ./a.txt my_redis:/data
复制容器文件到宿主机
docker cp my_redis:/data/a.txt /opt
#检查容器里文件系统结构的更改
字母代表含义
【A:添加文件或目录 D:文件或者目录删除 C:文件或者目录更改】
docker diff fd2ead81c584
#提交一个容器版本
docker commit -a lqf -m "V1" my_redis my_redis:V1
3:镜像推送
注册仓库dockerhup并创建仓库,百度
#登录仓库:
docker login
#登录完成 push镜像
cat ~/.docker/config.json
#查看有没有内容,确定是否登录成功
[root@master ~]# cat ~/.docker/config.json
{
"auths": {
"https://index.docker.io/v1/": {
"auth": "YTEyMHE6MjAxNjA4ZmEu"
}
}
}
#docker hub一个完整镜像的全路径是
#docker images的时候镜像缩略了全名 默认官方镜像没有docker.io/library/
docker pull redis:alpine3.13
docker.io/library/redis:alpine3.13 我们的 docker.io/a120q/my_redis:v4
a120q账户名
修改镜像标签才可以上传
docker tag k8s/my_redis:v4 a120q/my_redis:v4
docker push a120q/my_redis:v4
4:容器导入导出
export和import是把容器弄成tar包
导出成tar包
docker export -o redis.tar fd2ead81c584
导入
docker import ./redis.tar my_redis:v5
#docker export导出的文件被import导入以后变成镜像,并不能直接启动容器,需要知道之前的启动命令
#--no-trunc 不截断输出一些信息 可以查看之前容器启动的具体命令
docker ps --no-trunc
[root@master ~]# docker ps --no-trunc
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
417c0a6f2 nginx "/docker-entrypoint.sh nginx -g 'daemon off;'" 3 minutes ago Up 3 minutes 0.0.0.0:32768->80/tcp, :::32768->80/tcp l_nginx
#启动导入的镜像
docker run -d -p 80:80 lqf_nginx:v1 /docker-entrypoint.sh nginx -g 'daemon off;'
save和load是把镜像弄成tar包
#把镜像搞成tar包
docker save -o save.tar lqf_nginx:v1
#加载镜像
docker load -i save.tar
#镜像启动一定要有一个堵塞进程,才能一直运行,一直干活
5:Docker flile https://docs.docker.com/reference/dockerfile/
vim busyboxfile 创建文件编写内容,容器分层,几个命令就几个层
FROM busybox
#标签 k=v格式 镜像的说明信息
LABEL maintainer="lqf"
# CMD RUN 都可以取环境变量 ENV会被固化到config里面 运行期可以修改,构建的时候不允许修改
ENV parm=1234
docker run -it -e par=new111 nginx:v1 ENV参数:运行镜像时可以更改此属性的值
#-e只能修改env本身,构建期间确定好的值,无法修改,构建期间修改无效
docker run -it -e parm=new111 nginx:v1
# 构建参数 ARG
#docker build命令构建镜像时,可以通过 --build-arg abc=777
#选项来覆写Dockerfile中定义的ARG变量的默认值
#多阶段构建中,--build-arg 定义的变量可以在多个阶段之间共享
ARG abc=666
#容器构建时候执行的命令 会以shell*的 /bin/sh -c 的方式运行,避免破坏shell字符串
RUN echo 111
RUN echo $parm
RUN echo $abc
# exec方式 Docker会直接执行指定的可执行文件和参数,而不会通过shell进行变量展开
RUN ["echo","2222","$parm"]
RUN ["echo","$parm"]
RUN ["echo","$abc"]
#要使Exec形式也能取到环境变量的值,你需要利用shell来执行命令
RUN ["/bin/sh","-c","echo 2222 $parm"]
#ADD 上下文文件添加到镜像,下载链接会下载,压缩包会自动解压
ADD http://abc/a.txt /diskfile/ 放到这个文件下,/diskfile 是把下载的文件变成diskfile文件
RUN cd /diskfile
RUN ls -l #这块还是列举当前目录,cd无效果 run没有上下文效果
RUN cd /diskfile && ls -l #正确写法
#本地linux文件添加镜像里面去 (宿主机到镜像内)
#添加当前所有文件添加到app目录下,并解压 (docker build 构建环境指定的就是. 所以就是当前目录的所有文件
ADD *.gz /app/ 因为构建环境模式是当前环境,
# 这块*.不代表宿主机所有文件,而是当前位置的文件 即 ./
#USER 给容器开一个用户
USER redis:redis
USER 1000:1000
#COPY 上下文文件内容复制到镜像,不自动解压和下载
# --chown=user:group
#以容器的用户
RUN 开启一个redis账户 复制来的内容给redis用户所有权
COPY --chown=1000:1000 *.gz /app/
#WORKDIR 指定自己在哪个目录,不存在自动创建,
#为下面所有目录指定基础目录,多个WORKDIR可以嵌套
WORKDIR /opt/app
WORKDIR csv 相对路径 会叠加 即pwd= /opt/app/csv
WORKDIR /opt/lqf 进入容器会在这个目录下
COPY *.txt ./ #复制到的是在app目录下
#VOLUME 挂载容器的指定文件夹,不存在就创建
#容器启动就会默认挂载这2个目录,匿名卷挂载
VOLUME ["/opt","/app"] 挂载后,下面对挂载目录的命令写入的内容就会弃用,操作无效
CMD 的三种写法:
CMD ["executable","param1","param2"] ( exec 方式, 首选方式)
CMD ["param1","param2"] (为ENTRYPOINT提供默认参数)
CMD command param1 param2 ( shell 形式)ENTRYPOINT 的两种写法:
ENTRYPOINT ["executable", "param1", "param2"] ( exec 方式, 首选方式)
ENTRYPOINT command param1 param2 (shell 形式)
# EXPOSE 暴露端口,只是声明,
# 运行 -P 随机分配端口,也会给这2个端口做随机分配
EXPOSE 2181
EXPOSE 306
#ENTRYPOINT 正常的入口 不可以修改
ENTRYPOINT ping www.baidu.com 总是最后一个生效
ENTRYPOINT ["ping","baidu.com"] 推荐写法
#CMD 命令 后面可以改
CMD ["ping","baidu.com"] 推荐写法
CMD ping www.baidu.com 总是最后一个生效
ENTRYPOINT+CMD合在一起不能是错误的命令
docker run -it demo:v1 ping www.abc.com 可以修改cmd命令,ENTRYPOINT不能被修改
示例:
FROM ubuntu
ENTRYPOINT ["ping"] # 设置容器启动时执行的命令
CMD ["www.baidu.com"] # 提供 ENTRYPOINT 命令的默认参数
在这个 Dockerfile 中,容器启动时默认会执行 ping www.baidu.com。
但是,使用 docker run 时可以指定不同的参数:
docker run -it demo:v1 ping www.abc.com
这个命令会启动 demo:v1 镜像的容器,并执行 ping www.abc.com,
其中 www.abc.com 替换了 Dockerfile 中 CMD 指定的 www.baidu.com。
#容器启动时进行的命令
CMD ping www.baidu.com
#构建镜像 --no-cache 不用缓存 ./ 当前上下文环境,代表dockerfile所在的位置
# --progress=plain 输出更详细的信息,包括每一步的执行状态和输出
docker build -t my_busybox:v1 --no-cache -f ./busybox ./
运行我们刚刚构建的镜像
docker run -d my_busybox:v1
[root@master dockerfile]# docker ps --no-trunc
CONTAINERID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b7d2a892101 my_busybox:v1 "/bin/sh -c 'ping www.baidu.com'" 30 seconds ago Up 29 seconds practical_poitras
6:多阶段构建
#以下所有前提 保证Dockerfile和项目在同一个文件夹
# 第一阶段:环境构建; 用这个也可以
FROM maven:3.5.0-jdk-8-alpine AS lqf01
WORKDIR /app
ADD ./ /app
RUN mvn clean package -Dmaven.test.skip=true
# 第二阶段,最小运行时环境,只需要jre;第二阶段并不会有第一阶段哪些没用的层
#基础镜像没有 jmap; jdk springboot-actutor(jdk)
FROM openjdk:8-jre-alpine
LABEL maintainer="534096094@qq.com"
# 从上一个阶段复制内容,拿上第一个阶段的内容
COPY --from=lqf01 /app/target/*.jar /app.jar
# 修改时区
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo
'Asia/Shanghai' >/etc/timezone && touch /app.jar
ENV JAVA_OPTS=""
ENV PARAMS=""
# 运行jar包
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom
$JAVA_OPTS -jar /app.jar $PARAMS" ]
1: 同步容器时间
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo
'Asia/Shanghai' >/etc/timezone
或者
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo
'Asia/Shanghai' >/etc/timezone
可以让镜像时间同步。
## 容器同步系统时间 CST(China Shanghai Timezone)
-v /etc/localtime:/etc/localtime:ro
#已经不同步的如何同步?
docker cp /etc/localtime 容器id:/etc/
2:例子
FROM openjdk:8-jre-alpine
LABEL maintainer="3174865@qq.com"
COPY target/*.jar /app.jar
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo
'Asia/Shanghai' >/etc/timezone && touch /app.jar #这步会更新文件的时间,不会对旧文件造成影响
ENV JAVA_OPTS=""
ENV PARAMS=""
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom
$JAVA_OPTS -jar /app.jar $PARAMS" ]
运行命令 docker run -e JAVA_OPTS="-Xmx512m -Xms33 -" -e PARAMS="--
spring.profiles=dev --server.port=8080" -jar /app/app.jar
3:使用 .dockerignore 文件,排除上下文中无需参与构建的资源
*.css
app/*
使用多阶段构建 合理使用构建缓存加速构建。[--no-cache] 通过这些;来减少镜像的大小
7:Docker存储
7.1:容器的挂载
7.1.1:Volumes(卷) : /var/lib/docker/volumes(卷的根目录)
docker volume create xxx:创建卷名
docker volume inspect xxx:查询卷详情
docker volume ls: 列出所有卷
docker volume prune: 移除无用卷
存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上是“ / var /
lib / docker / volumes /”)。 非Docker进程不应修改文件系统的这一部分。 卷是在Docker中持久存
储数据的最佳方法。
docker volume #可以对docker自己管理的卷目录进行操作;
#默认rw权限,ro容器只读
-v /root/html:/usr/share/nginx/html:ro
挂载的几种不同效果:
1:docker run -d -P --name=my_nginx -v /root/html:usr/share/nginx/html nginx
2:-v /root/modules/html:usr/share/nginx/html 指定宿主机文件和容器文件的映射(会覆盖容器的文件,空目录会把容器文件置空!)
3:-v html:usr/share/nginx/html 创建一个名字为html的卷,等同于:docker create volume html 创建一个html名字的卷, -v html:usr/share/nginx/html
4:-v /usr/share/nginx/html 匿名卷
7.1.2: Bind mounts(绑定挂载) :
可以在任何地方存储在主机系统上,它们甚至可能是重要的系统文件或目录。
Docker主机或Docker容器上的非Docker进程可以随时对其进行修改。
# bind mount和 volumes 的方式写法区别在于
# 所有以/开始的都认为是 bind mount ,不以/开始的都认为是 volumes.
##此种方法:外部目录覆盖内部容器目录内容,但不是修改。所以谨慎,外部空文件夹挂载方式也会导
致容器内部是空文件夹
7.1.3: tmpfs mounts(临时挂载)
仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统
8:Docker网络
8.1:默认网络原理
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。
因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信
每一个安装了Docker的linux主机都有一个docker0的虚拟网卡。桥接网卡
每启动一个容器linux主机多了一个虚拟网卡
8.2: 网络模式
网络模式 | 配置 | 说明 |
bridge模式 | --net=bridge | 默认值,在Docker网桥docker0上为容器创建新的网络 栈 |
none模式 | --net=none | 不配置网络,用户可以稍后进入容器,自行配置 |
container模 式 | --net=container:name/id | 容器和另外一个容器共享Network namespace。 kubernetes中的pod就是多个容器共享一个Network namespace。 |
host模式 | --net=host | 容器和宿主机共享Network namespace; |
用户自定义 | --net=mynet | 用户自己使用network相关命令定义网络,创建容器的时候可以指定为自己定义的网络 |
8.2: docker network
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
50a63f16d571 1panel-network bridge local
3b8ba4a7497a bridge bridge local 默认网络
f60549f36510 host host local
736f20af6442 none null local
#查看网络
docker inspect network 3b8ba4a7497a
8.3: --link来链接容器 (不推荐)
--link=tomcat01 tomcat01是容器的名字
创建nginx容器
docker run -d -P --name=nginx nginx
创建redis容器,并在启动时链接到nginx 直接ping容器名字
docker run -d -P --name=redis --link=nginx redis
docker exec -it redis /bin/bash
##进入容器查看hosts,可以看到--link是写死在机器里面,不推荐此写法,而且是单向配置,对方不知道
root@b1b09b664afe:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.5 nginx ea76f555ef83
172.17.0.7 b1b09b664afe
8.4: docker自定义网络 (推荐)
创建一个网络, bridge是默认的可以不写,默认桥接模式
模式 子网 网关 名称
docker network create -d bridge --subnet=192.168.0.0/16 --gateway=192.168.0.1 mylqf
[root@master ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
50a63f16d571 1panel-network bridge local
3b8ba4a7497a bridge bridge local
f60549f36510 host host local
2895c04c0d28 mylqf bridge local
736f20af6442 none null local
--network 简写: --net
8.5: 指定网络
docker run -d -P --name=redis --net=mylqf redis
8.6: 容器网络
新建的容器共享另一个名为 redis
的容器的网络命名空间,也就是说,新容器 redis02
会继承 redis
容器的 IP 地址和端口映射
docker run -it --name=alpine --net container:redis alpine
8.7: 加入到其网络
把nginx1容器加入到自定义网络mylqf去
网络名 容器名
docker network connect mylqf nginx1
docker inspect nginx1
可以看到容器处在2个网络环境中
9: docker-compose
参考:https://docs.docker.com/compose/install/
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 安装docker-compose
curl -SL https://github.com/docker/compose/releases/download/v2.27.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
docker-compose
示例:
步骤 1:设置
1:为项目创建目录:
mkdir composetest
cd composetest
2:在您的项目目录中创建一个名为的文件app.py
并粘贴以下代码:
import time
import redis
from flask import Flask
app = Flask(__name__)
cache = redis.Redis(host='redis', port=6379)
def get_hit_count():
retries = 5
while True:
try:
return cache.incr('hits')
except redis.exceptions.ConnectionError as exc:
if retries == 0:
raise exc
retries -= 1
time.sleep(0.5)
@app.route('/')
def hello():
count = get_hit_count()
return 'Hello World! I have been seen {} times.\n'.format(count)
3:在您的项目目录中创建另一个名为的文件requirements.txt
并粘贴以下代码:
flask
redis
4:创建一个Dockerfile
并粘贴以下代码
# syntax=docker/dockerfile:1
FROM python:3.10-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run", "--debug"]
第 2 步:在 Compose 文件中定义服务
Compose 简化了整个应用程序堆栈的控制,使您可以轻松地在单个易于理解的 YAML 配置文件中管理服务、网络和卷。
在您的项目目录中创建一个名为的文件compose.yaml
并粘贴以下内容:
services: #所需要启动的服务
web: #第一个服务的名字
build: . #构建路径 /dir
ports: #指定启动容器暴露的端口
- "18000:5000"
redis:# 第二个服务的名字
image: "redis:alpine"
该Compose文件定义了两个服务:web
和redis
。
该web
服务使用从当前目录中构建的镜像Dockerfile
。然后它将容器和主机绑定到公开端口。8000
此示例服务使用 Flask Web 服务器的默认端口5000
。
该redis
服务使用 从 Docker Hub 注册表中提取的公共Redis映像。
有关该compose.yaml
文件的更多信息,请参阅 Compose 的工作原理。
第 3 步:使用 Compose 构建并运行您的应用
1:使用单个命令,您可以从配置文件创建并启动所有服务。
[root@master docker-compose]# docker compose up
docker compose up -d后台运行
#会创建自定义网络
Creating network "composetest_default" with the default driver
[+] Running 2/0
✔ Container docker-compose-redis-1 Created 0.0s
✔ Container docker-compose-web-1 Recreated 0.0s
Attaching to redis-1, web-1
redis-1 | 1:C 18 Jun 2024 14:29:18.459 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
redis-1 | 1:C 18 Jun 2024 14:29:18.459 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=1, just started
redis-1 | 1:C 18 Jun 2024 14:29:18.459 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
redis-1 | 1:M 18 Jun 2024 14:29:18.460 * monotonic clock: POSIX clock_gettime
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * Running mode=standalone, port=6379.
redis-1 | 1:M 18 Jun 2024 14:29:18.461 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis-1 | 1:M 18 Jun 2024 14:29:18.461 # Server initialized
redis-1 | 1:M 18 Jun 2024 14:29:18.461 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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.
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * Loading RDB produced by version 6.2.6
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * RDB age 62 seconds
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * RDB memory usage when created 0.77 Mb
redis-1 | 1:M 18 Jun 2024 14:29:18.461 # Done loading RDB, keys loaded: 0, keys expired: 0.
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * DB loaded from disk: 0.000 seconds
redis-1 | 1:M 18 Jun 2024 14:29:18.461 * Ready to accept connections
web-1 | * Serving Flask app 'app.py'
web-1 | * Debug mode: on
web-1 | WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
web-1 | * Running on all addresses (0.0.0.0)
web-1 | * Running on http://127.0.0.1:5000
web-1 | * Running on http://172.20.0.3:5000
web-1 | Press CTRL+C to quit
web-1 | * Restarting with stat
web-1 | * Debugger is active!
web-1 | * Debugger PIN: 331-673-268
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:30] "GET / HTTP/1.1" 200 -
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:30] "GET /favicon.ico HTTP/1.1" 404 -
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:32] "GET / HTTP/1.1" 200 -
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:32] "GET / HTTP/1.1" 200 -
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:32] "GET / HTTP/1.1" 200 -
web-1 | 172.20.0.1 - - [18/Jun/2024 14:29:33] "GET / HTTP/1.1" 200 -
Compose 会拉取 Redis 镜像,为您的代码构建镜像,并启动您定义的服务。在这种情况下,代码会在构建时静态复制到镜像中。
2: http://localhost:18000/
在浏览器中输入即可看到应用程序正在运行。
如果这不能解决,您还可以尝试http://127.0.0.1:18000
。
你应该会在浏览器中看到一条消息:
Hello World! I have been seen 1 times.
3: 刷新页面。
该数字应该会增加。
Hello World! I have been seen 2 times.
4:切换到另一个终端窗口,然后输入docker image
列出本地图像。
此时列出图像应该返回docker-compose-web。
[root@master docker-compose]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-compose-web latest 15a15b124d79 5 minutes ago 188MB
5:停止该应用程序,可以通过docker compose down
在第二个终端中的项目目录中运行来停止,也可以通过点击CTRL+C
启动该应用程序的原始终端来停止。
10 扩展:可视化界面-Portainer
#重启策略:--restart=always 总是重启
未指定容器可以用docker update rediscp --restart=always 去更新容器的重启策略
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-ce
#agent端部署
docker run -d -p 9001:9001 --name portainer_agent --restart=always -v
/var/run/docker.sock:/var/run/docker.sock -v
/var/lib/docker/volumes:/var/lib/docker/volumes portainer/agent