Docker入门学习教程

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文件定义了两个服务:webredis

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

  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值