Docker学习笔记

目录

一、Docker的安装

1、卸载旧版本:

2、需要的安装包:

3、设置镜像仓库(阿里云镜像):

4、更新yum包索引

5、安装docker相关的内容

6、运行docker

7、使用docker version 查看是否安装成功

8、测试helloworld

9、卸载docker

1、卸载依赖

2、删除资源

3、镜像加速

二、Docker的常用命令

1、帮助命令

2、镜像命令:

1、docker images #查看本地主机上的所有镜像

2、docker search 搜索镜像

3、docker pull 镜像下载

4、docker rmi 删除镜像

3、容器命令

1、新建容器并启动

2、启动并进入容器

3、列出所有在运行中的容器

4、退出容器

5、删除容器

6、启动和停止容器的操作

7、后台启动容器

8、查看日志

9、查看容器中进程信息

10、查看docker元数据

11、进入当前正在运行的容器

4、小结

Docker安装nginx

为何要暴露端口?

安装tomcat

Docker可视化

*commit镜像:

三、容器数据卷

1、什么是容器数据卷

2、使用数据卷

3、具名挂载、匿名挂载

1、匿名挂载

2、具名挂载

四、dockerfile

1、DockerFile的命令

2、CMD和ENTRYPOINT的区别

3、Tomcat镜像

1、构建镜像

2、启动镜像

3、访问测试

小结:

五、Docker网络

1、理解Docker0:

        1、清空所有环境

        2、测试:

通过 --link 就可以解决网络连通问题

六、SpingBoot微服务打包Docker镜像

1、构建springboot项目

2、打包项目

3、编写Dockerfile

4、构建镜像

5、发布运行!

七、Docker Compose

1、简介:

2、安装compose

1、下载

2、授权

3、getting started

八、Docker Swarm


一、Docker的安装

1、卸载旧版本:

yum remove docker \

                  docker-client \

                  docker-client-latest \

                  docker-common \

                  docker-latest \

                  docker-latest-logrotate \

                  docker-logrotate \

                  docker-engine

2、需要的安装包:

yum install -y yum-utils

3、设置镜像仓库(阿里云镜像):

yum-config-manager \

    --add-repo \

   http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4、更新yum包索引

yum makecache fast

5、安装docker相关的内容

yum install docker-ce docker-ce-cli containerd.io

6、运行docker

systemctl start docker

7、使用docker version 查看是否安装成功

docker version

8、测试helloworld

docker run hello-world

查看下载的helloworld镜像

docker images

9、卸载docker

1、卸载依赖

yum remove docker-ce docker-ce-cli containerd.io

2、删除资源

rm -rf /var/lib/docker

rm -rf /var/lib/containerd

3、镜像加速

sudo mkdir -p /etc/docker

sudo tee /etc/docker/daemon.json <<-'EOF'

{

"registry-mirrors": ["https://tibjzfhr.mirror.aliyuncs.com"]

}

EOF

sudo systemctl daemon-reload

sudo systemctl restart docker

二、Docker的常用命令

1、帮助命令

docker version #查看docker版本信息

docker info #查看docker详细信息

docker 命令 --help #万能命令

帮助文档:Docker run reference | Docker Documentation

2、镜像命令:

1、docker images #查看本地主机上的所有镜像

[root@localhost docker]# docker images

REPOSITORY    TAG       IMAGE ID       CREATED       SIZE

hello-world   latest    feb5d9fea6a5   7 weeks ago   13.3kB

#解释:

REPOSITORY 镜像仓库源

TAG 镜像的标签

IMAGE ID 镜像的id

CREATED 创建的时间

SIZE 镜像的大小

#可选项:

  -a, --all             #列出所有镜像

  -q, --quiet           #只显示镜像id

2、docker search 搜索镜像

[root@localhost docker]# docker search mysql

NAME       DESCRIPTION                                        STARS     OFFICIAL   AUTOMATED

mysql      MySQL is a widely used, open-source relation…   11686     [OK]       

mariadb    MariaDB Server is a high performing open sou…   4453      [OK]       

#可选项,通过收藏来过滤:

--filter=STARS=3000 #搜索出来的镜像就是STARS大于3000的

[root@localhost docker]# docker search mysql --filter=STARS=5000

NAME      DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED

mysql     MySQL is a widely used, open-source relation…   11686     [OK]

3、docker pull 镜像下载

#下载镜像 docker pull 镜像名[:tag]

[root@localhost docker]# docker pull mysql

Using default tag: latest #如果不写 tag,默认就是latest

latest: Pulling from library/mysql

b380bbd43752: Pull complete #分层下载,docker image的核心 联合文件系统

f23cbf2ecc5d: Pull complete

30cfc6c29c0a: Pull complete

b38609286cbe: Pull complete

8211d9e66cd6: Pull complete

2313f9eeca4a: Pull complete

7eb487d00da0: Pull complete

4d7421c8152e: Pull complete

77f3d8811a28: Pull complete

cce755338cba: Pull complete

69b753046b9f: Pull complete

b2e64b0ab53c: Pull complete

Digest: sha256:6d7d4524463fe6e2b893ffc2b89543c81dec7ef82fb2020a1b27606666464d87 #签名

Status: Downloaded newer image for mysql:latest

docker.io/library/mysql:latest #真实地址

#两者等价

docker pull mysql

docker pull docker.io/library/mysql:latest

#指定版本下载

docker pull mysql:5.7

4、docker rmi 删除镜像

docker rmi -f [镜像ID]  #删除指定镜像

docker rmi -f [镜像ID] [镜像ID] [镜像ID] #删除多个镜像

docker rmi -f $(docker images -aq) #删除所有的镜像

3、容器命令

#说明:有了镜像才可以创建容器,liunx,下载一个centos镜像测试

docker pull centos

1、新建容器并启动

docker run [可选参数] image

#参数说明

--name=Name #容器名字 tomcat01 tomcat02 ,用来区分容器

-d #后台运行

-it #使用交互方式运行,进入容器查看内容

-p #指定容器的端口

-p ip:主机端口:容器端口

-p 主机端口:容器端口(常用)

-p 容器端口

容器端口

-P #随机指定端口

2、启动并进入容器

#测试,

[root@localhost docker]# docker run -it centos /bin/bash

[root@3dbda64e7ffc /]# ls # 查看容器内的centos

bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

[root@3dbda64e7ffc /]# exit #从容器中退回到主机

3、列出所有在运行中的容器

#docker ps 命令

#列出当前正在运行的容器

-a #列出当前正在运行的容器+带出历史运行过的容器

-n=? #列出最近创建的容器

-q #只显示容器的编号

[root@localhost docker]# docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@localhost docker]# docker ps -a

CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS              PORTS     NAMES

3dbda64e7ffc   centos     "/bin/bash"   15 minutes ago   Exited (0) 13 minutes ago   strange_johnson

73a2a60b0032   feb5d9fea6a5   "/hello"   27 hours ago Exited (0) 27 hours ago   suspicious_margulis

4、退出容器

exit #容器停止并退出

ctrl + p + q #容器不停止退出

5、删除容器

Docker rm 容器id  #删除某个容器 不能删除正在运行的容器,若要强制删除 rm -f

Docker rm -f $(docker ps -aq)  #删除所有容器

Docker ps -a -q|xargs docker rm #删除所有容器

6、启动和停止容器的操作

docker start 容器id #启动容器

docker restart 容器id #重启容器

docker stop 容器id #停止容器

docker kill 容器id #强行杀死容器

7、后台启动容器

#命令docker run -d 镜像名

[root@localhost docker]# docker run -d centos

#问题docker ps,发现centos 停止了

#常见的坑: docker容器使用后台运行,必须要有一个前台进程,docker发现没有应用,就会自动停止

8、查看日志

docker logs

docker logs -tf --tail 10 容器id #查看容器所有日志

-tf #显示日志

--tail number #要显示的日志条数

9、查看容器中进程信息

#命令 docker top 容器id

[root@localhost docker]# docker top b68e9698b874

UID     PID     PPID       C      STIME        TTY                TIME               CMD

root    11411   11394      0      23:34        pts/0            00:00:00            /bin/bash

10、查看docker元数据

docker inspect 容器id

[root@localhost docker]# docker inspect b68e9698b874

11、进入当前正在运行的容器

#我们通常容器都是使用后台方式运行的,需要进入容器,修改一些配置

方式一:#命令:docker exec -it 容器id bashShell

[root@localhost docker]# docker exec -it b68e9698b874 /bin/bash

#-it 进行交互模式

方式二:#命令:docker attach 容器id

[root@localhost docker]# docker attach b68e9698b874

#正在执行当前代码

#docker exec #进入容器后开启一个新的终端,可以在里面操作(常用)

#docker attach #进入容器正在执行的终端,不会启动新的进程

从容器中拷贝到主机上

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

#查看当前主机目录

[root@c198f09f7ace /]# [root@localhost home]# ls

reeve

[root@localhost home]# docker ps

CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES

c198f09f7ace   centos    "/bin/bash"   16 seconds ago   Up 15 seconds             zen_mendeleev

#进入docker容器内部

[root@localhost home]# docker attach c198f09f7ace

[root@c198f09f7ace /]# cd /home

[root@c198f09f7ace home]# ls

在容器内创建test.java

[root@c198f09f7ace home]# touch test.java

[root@c198f09f7ace home]# ls

test.java

[root@c198f09f7ace home]# exit

exit

[root@localhost home]# docker ps

CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES

[root@localhost home]# docker ps -a

CONTAINER ID   IMAGE          COMMAND       CREATED          STATUS                         PORTS     NAMES

c198f09f7ace   centos         "/bin/bash"   2 minutes ago    Exited (0) 36 seconds ago                zen_mendeleev

631c58b5f5b4   centos         "/bin/bash"   3 minutes ago    Exited (127) 2 minutes ago               ecstatic_brown

b68e9698b874   centos         "/bin/bash"   28 minutes ago   Exited (0) 14 minutes ago                determined_pasteur

417e2744ccbc   centos         "/etc/bash"   29 minutes ago   Created                                  condescending_swanson

771f60030845   centos         "/bin/bash"   41 minutes ago   Exited (0) 41 minutes ago                friendly_clarke

3dbda64e7ffc   centos         "/bin/bash"   2 hours ago      Exited (0) About an hour ago             strange_johnson

73a2a60b0032   feb5d9fea6a5   "/hello"      29 hours ago     Exited (0) 29 hours ago                  suspicious_margulis

# 将文件拷贝出来到主机

[root@localhost home]# docker cp c198f09f7ace:home/test.java /home

[root@localhost home]# ls

reeve  test.java

4、小结

  • Docker安装nginx

docker search nginx # 搜索nginx相关镜像

docker pull nginx # 下载nginx最新版本

docker images # 查看docker镜像

docker run -d --name nginx01 -p 3344:80 nginx #运行nginx镜像

-d 后台运行  --name 重命名为:nginx01  -p 暴露端口,属主机端口:容器内端口

为何要暴露端口?

-- 暴露端口的概念

  • 安装tomcat

docker run -it --rm tomcat:9.0

--rm 一般用来测试,用完就删除

下载tomcat:docker pull tomcat:9.0

运行tomcat : docker run -d -p 3355:8080 --name tomcat01 tomcat

#进入3355端口发现404

进入容器:[root@localhost home]# docker exec -it tomcat01 /bin/bash

因为:1、linux命令少了,2、没有webapps 阿里云镜像的问题,默认最小的镜像,所有不必要的都剔除了。

解决方法,将webapps.dist内的所有文件cp到webapps内

root@ae9cb56f31aa:/usr/local/tomcat# cp -r webapps.dist/* webapps

  • Docker可视化

Portainer、Rancher(CI/CD)

  1. 什么是Portainer? Docker图形化管理工具,提供后台供我们操作

docker run -d -p 8088:9000 \

--restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

Portainer用户账号:admin 密码:admin123

  1. Rancher

*commit镜像:

docker commit 提交容器成为一个新的副本

#命令和git原理类似

dockers commit -m=提交的描述信息 -a=作者 容器id 目标镜像名:[tag]

(我的理解:就是将当前的容器打包成一个镜像,并可以方便迭代的镜像!)

三、容器数据卷

1、什么是容器数据卷

模拟一个场景,当前如果把容器删了里面的数据都会删除,也就是数据无法持久化

于是就需要有个容器之间的数据共享的技术!

Docker容器中产生的数据同步到本地,这就是卷技术!

总结:也就是要实现容器的持久化和同步操作!实现容器之间的数据可共享!

2、使用数据卷

方式一:直接使用命令来挂载 -v

docker run -it -v 主机目录:容器内目录

#测试

[root@localhost /]# docker run -it -v /home/test01:/home centos /bin/bash

#启动后通过docker inspect 容器id

测试文件同步:双向绑定

尽管停止容器,修改主机上的文件内容,再启动容器,容器内的数据依旧是同步的!

好处:以后修改只需要本地修改即可,不用再进容器内部,容器会自动同步。

3、具名挂载、匿名挂载

1、匿名挂载

-v 容器内路径

docker run -d -P --name nginx01 -v /etc/nginx nginx

#查看所有volume的情况

docker volume ls

DRIVER    VOLUME NAME

local     01afa927dc72205b87ef302606622dc1683ce921b343f3eefc20e0f18f8e7014

local     a778597f40f0f26a4b6769bd3b7fdb1e32a776c4d89e822e6bacbf3b77d8b33b

#这种就是匿名挂载,我们在-v只写了容器内的路径,没有写容器外的路径!

2、具名挂载

[root@localhost reeve]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx

1828785e85662f0f338ae237dc1eebf5cd98c747e3df3809221d002893f1cf93

[root@localhost reeve]# docker volume ls

DRIVER    VOLUME NAME

local     juming-nginx

# 通过 -v 卷名:容器内路径

# 查看一下这个卷

#所有docker内容器的卷,没有指定目录的情况下都是在/var/lib/docker/volumes/xxxx/_data

我们通过具名挂载可以方便的找到我们的卷,大多数情况在使用具名挂载

如何确定是具名挂载还是匿名挂载还是指定路径挂载

-v 容器内路径 #匿名挂载

-v 卷名:容器内路径 #具名挂载

-v /宿主机路径:容器内路径 #指定路径挂载

#拓展:

#通过 -v 容器内路径:ro rw 改写读写权限

ro readonly #只读

rw readwrite #可读可写

#一旦设置了容器权限,容器对我们的挂载出来的内容就有了限定

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:ro nginx

docker run -d -P --name nginx01 -v juming-nginx:/etc/nginx:rw nginx

#只要看到ro就说明这个路径只能通过宿主机来操作,容器内是无法操作的

# 默认就是rw

四、dockerfile

dockerfile 就是用了构建docker镜像的构建文件!

通过脚本可以生成镜像,镜像就是一层一层的,脚本是一个一个的命令,每个命令都是一层

#创建一个dockerfile文件,名字可以随机,建议Dockerfile

#文件中的内容 指令(大写) 参数

FROM centos

VOLUME [“volume01”,”volume02”]

CMD echo “----END----”

CMD /bin/bash

#这里每个命令都是镜像的一层

#这个目录就是我们生成镜像的时候自动挂载的,数据卷目录

这个卷和外部一定有个同步的目录

查看卷挂载的路径:

测试刚刚创建的txt文件是否同步出去

[root@localhost ~]# cd /var/lib/docker/volumes/7c444642485fce0500cf713b54af3b379499ddb3c92a5d88da32dae15514bc27/_data

[root@localhost _data]# ls

juantest.txt

假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径

dockerFile:构建文件,定义一切的步骤,源代码

dockerImages:通过dockerFile构建生成镜像,最终发布和运行的产品,原来是jar war。

docker容器:容器就是镜像运行起来提供服务的

1、DockerFile的命令

FROM #基础镜像,一切从这里开始构建

MAINTAINER #镜像是谁写的,姓名+邮箱

RUN #镜像构建时候需要运行的命令

ADD #步骤:tomcat镜像,这个tomcat的压缩包,添加内容

WORKDIR #镜像的工作目录

VOLUME #挂载的目录位置

EXPOSE #暴露端口配置

CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令,

ONBUILD #当构建一个被继承DockerFile,这个时候就会运行ONBUILD的指令,触发指令

COPY #类似ADD,将我们的文件拷贝到镜像中

ENV #构建的时候设置环境变量

2、CMD和ENTRYPOINT的区别

CMD #指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT #指定这个容器启动的时候要运行的命令,可以追加命令

CMD命令测试!

[root@localhost _data]# vim docker-file-test

FROM centos

CMD [ls,-a]

#构建镜像

[root@localhost _data]# docker build -f docker-file-test -t cmdtest .

#启动镜像  ls -a 命令生效

[root@localhost _data]# docker run 48774fe6d949

#想追加一个命令,-l ls -al

[root@localhost _data]# docker run 48774fe6d949 -l

docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

#cmd的清理下 -l 替换了CMD [ls,-a] 命令,-l不是命令所以报错

ENTRYPOINT命令测试!

#同样的命令,由CMD改成ENTRYPOINT

[root@localhost _data]# vim docker-ENTRYPOINT-file-test

FROM centos

ENTRYPOINT [ls,-a]

#构建镜像

[root@localhost _data]# docker build -f docker-ENTRYPOINT-file-test -t entrypoint-test .

[root@localhost _data]# docker run d31ce82bcd09

#追加命令,直接拼接在我们的ENTRYPOINT的后面的

[root@localhost _data]# docker run d31ce82bcd09 -l

total 0

drwxr-xr-x   1 root root   6 Nov 17 06:49 .

3、Tomcat镜像

  1. 准备镜像文件,tomcat压缩包和jdk压缩包
  2. 编写Dockerfile文件,官方命名Dockerfile,build会自动寻找这个文件,就不需要-f指定了

FROM centos

MAINTAINER reeve<"mysharp163@163.com">

COPY readme.txt /usr/local/readme.txt

ADD apache-tomcat-9.0.55-src.tar.gz /usr/local/

ADD jdk-8u60-linux-x64.tar.gz /usr/local/

RUN yum -y install vim

ENV MYPATH /usr/local

WORKDIR $MYPATH

ENV JAVA_HOME /usr/local/jdk1.8.0_60

ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.55

ENV CATALINE_BASH /usr/local/apache-tomcat-9.0.55

ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin

EXPOSE 8080

CMD /usr/local/apache-tomcat-9.0.55/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.55/bin/logs/catalina.out

1、构建镜像

docker build -t mytomcat .

2、启动镜像

docker run -it mytomcat /bin/bash

3、访问测试

  1. 发布项目(由于做了卷挂载,我们直接在本地编写项目就可以发布了)

发布自己镜像

  1. 地址:Docker Hub
  2. 在我们服务器上提交自己的镜像

  1. 登录完毕后就可以提交镜像了

docker push localhost/镜像名称:1.0

小结:

五、Docker网络

1、理解Docker0:

        1、清空所有环境

docker rm -f $(docker ps -aq)

docker rmi -f $(docker images -aq)

        2、测试:

三个网络

#问题:docker是如何处理容器网络访问的? ip addr ,发现容器启动时候会得到一个ip地址,docker分配

docker exec -it tomcat01 ip addr

linux能不能ping通容器内部? -- linux能ping通docker容器内部

原理:1、我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0桥接模式,使用的技术是veth-pair技术

再次测试ip addr

再启动一个docker容器,发现又多了一对网卡

发现:容器带来的网卡,都是一对的,这就是veth-pair技术

#veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一段连着协议,一段彼此相连,正因为有这个特性,veth-pair充当一个桥梁,连接各种虚拟网络设备的

openStac,Docker容器之间的连接,ovs的连接,都是使用veth-pair技术。

容器内部之间也可以互相ping通的!

绘制网络模型图

结论:tomcat01和tomcat02是公用的一个路由器,docker0

所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip

小结:

Docker 使用的是linux的桥接,宿主机中是一个docker容器的网桥 docker0

docker中的所有网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)

只要容器删除,对应的网桥一对就没了

一种场景,当我们编写一个微服务,database url=ip ,项目不重启,数据库的ip变了,我们希望可以处理这个问题,可以通过名字来进行访问容器?

docker exec -it tomcat02 ping tomcat01

是ping不同的! 那么如何解决呢?

docker run -d -P --name tomcat03 --link tomcat02 tomcat
docker exec -it tomcat03 ping toomcat02

通过 --link 就可以解决网络连通问题

但是!tomcat02是ping不通03的!

其实这个tomcat03就是在本地配置了tomcat02的配置

本质探究:--link就是我们在hosts 配置中增加了一个tomcat02的映射

但是不建议使用 --link了,不建议使用docker0

docker0的问题:它不支持容器名连接访问!

网络连通

 连通之后就是将tomcat01放到mynet容器下

一个容器两个ip地址

#测试打通 tomcat01 -- mynet
docker network connect mynet tomcat01

结论:假设要跨网络操作别人,就需要使用docker network connect 连通

六、SpingBoot微服务打包Docker镜像

1、构建springboot项目

2、打包项目

3、编写Dockerfile

FROM java:8
COPY *.jar /app.jar
CMD ["-----server.port=19317"]
EXPOSE 19317
ENTRYPOINT ["java","-jar","/app.jar"]

4、构建镜像

docker build -t (项目名)

5、发布运行!

docker run -d -P --name (项目名) (镜像名)

七、Docker Compose

1、简介:

        之前我们是DockerFile build run 手动操作单个容器,但是当有几十个上百个微服务的时候,其中有一个没有启动起来就非常麻烦

Docker Compose 来轻松高效的管理容器,定义运行多个容器。

官方介绍:

#定义、运行多个容器

#YAML file 配置文件

#single command 命令有哪些

Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration. To learn more about all the features of Compose, see the list of features.

#所有环境都可以使用Compose

Compose works in all environments: production, staging, development, testing, as well as CI workflows. You can learn more about each case in Common Use Cases.

#三步骤

Using Compose is basically a three-step process:

  1. Define your app’s environment with a Dockerfile so it can be reproduced anywhere.  # Dockerfile保证我们的项目在任何地方可以运行 

  2. Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment.                                                                                 # services 什么是服务?                                                                                        # docker-compose.yml这个文件怎么写

  3. Run docker compose up and the Docker compose command starts and runs your entire app. You can alternatively run docker-compose up using the docker-compose binary.                                                                                                                             # 启动项目

作用:批量容器编排

Compose是Docker官方的开源项目,但是需要安装

Dockerfile 让程序在任何地方运行。web服务。redis、mysql、nginx。。。多个容器。

version: "3.9"  # optional since v1.27.0
services:
  web:
    build: .
    ports:
      - "5000:5000"
    volumes:
      - .:/code
      - logvolume01:/var/log
    links:
      - redis
  redis:
    image: redis
volumes:
  logvolume01: {}

compose:重要概念:

1、服务service ,容器。应用。(web、redis、mysql...)

2、项目project 。一组关联的容器

2、安装compose

1、下载

(Install Docker Compose | Docker Documentation)

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

2、授权

sudo chmod +x /usr/local/bin/docker-compose

#查看是否安装成功
docker-compose version

3、getting started

(Get started with Docker Compose | Docker Documentation)

   Step 1: Setup,在随意文件夹内创建composetest文件

mkdir composetest
cd composetest

        并创建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)

        创建文件requirements.txt,内容为:

flask
redis

Step 2: 创建一个 Dockerfile

        创建文件Dockerfile,内容为:

# syntax=docker/dockerfile:1
FROM python:3.7-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"]

Step 3: 在 Compose 文件中定义服务

        创建文件docker-compose.yml,内容为:(定义了web,redis)

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

Step 4:使用 Compose 构建并运行您的应用程序

通过运行启动您的应用程序 

docker-compose up

关闭compose

docker-compose down || ctrl+c 

4、yaml 规则

        docker-compose.yaml 核心

        官方文档:Compose file | Docker Documentation

        #三层:版本、服务、其他配置

        version ''         #版本

        service        #服务

                服务1:web

                        #服务配置

                  images

                  build

                  network

                  ...

                服务2:redis

                服务3:redis

                ...

#其他配置 网络/卷、全局规则

        volume:

        networks:

        comfigs:

5、博客

Quickstart: Compose and WordPress | Docker Documentation

        原:下载程序、安装数据库、配置等系列操作

        compose应用,一键启动。

        1、下载项目(docker-compose.yaml)

        2、如果需要文件Dockerfile

        3、文件准备齐全(直接一键启动项目)

        前台启动

        docker -d

        docker-compose up -d

6、项目部署

        1、编写项目微服务

        2、dockerfile构建镜像

        3、docker-compose.yaml 编排项目

        4、丢到服务器 docker-compose up

假设项目需要重新部署打包:

docker-compose up --build

总结

        工程、服务、容器

        项目compose:三层

                ·工程project

                ·服务

                ·容器 运行实例  

八、Docker Swarm

集群的方式部署

待更新..


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值