-1 Docker

常用命令

镜像的命令

查看所有镜像

docker images

只显示镜像 ID

docker images -q

搜索镜像,和在 docker hub 搜索镜像一样

docker search mysql

下载镜像

docker pull

删除镜像

docker rmi 

容器的命令

运行容器

docker run 参数 image

参数说明

  • --name="name" 给容器起个名字
  • -d 以后台方式运行
  • -it 以交互方式运行
  • -p 指定容器的端口
    • -p 容器端口
    • -p 宿主机端口:容器端口
  • -P 大写P,随机端口

启动并进入容器

[root@master ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
centos       latest    300e315adb2f   4 months ago   209MB
[root@master ~]# docker run -it centos /bin/bash
[root@bd538f39c881 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@bd538f39c881 /]# exit
exit
[root@master ~]# ls
[root@master ~]#

查看容器

查看正在运行的容器

docker ps 

查看所有容器

docker ps -a

显示最近创建的容器

docker ps -n

只显示容器的 ID

docker ps -q
[root@master ~]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@master ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                         PORTS     NAMES
bd538f39c881   centos    "/bin/bash"   About an hour ago   Exited (0) About an hour ago             elegant_elbakyan
[root@master ~]# docker ps -n=1
CONTAINER ID   IMAGE     COMMAND       CREATED             STATUS                         PORTS     NAMES
bd538f39c881   centos    "/bin/bash"   About an hour ago   Exited (0) About an hour ago             elegant_elbakyan
[root@master ~]# docker ps -aq
bd538f39c881

退出容器

退出并停止容器

exit

退出但不停止容器

control + p + q

停止、启动、重启容器

停止运行中的容器

docker stop 容器id

启动已停止的容器

docker start 容器id

重启运行中的容器

docker restart 容器id

删除容器

docker rm 容器id

查看容器日志

docker logs 参数 容器id 

参数

  • -f 实时日志
  • --tail number 显示指定行数
  • -t 显示时间戳

查看容器中的进程

docker top 容器id

查看 docker 的详细信息

docker inspect 容器id

进入容器

docker exec -it 容器id 命令
[root@master ~]# docker ps
CONTAINER ID   IMAGE     COMMAND       CREATED          STATUS          PORTS     NAMES
fd6d05a53924   centos    "/bin/bash"   36 minutes ago   Up 36 minutes             awesome_diffie
[root@master ~]# docker exec -it fd6d05a53924 /bin/bash
[root@fd6d05a53924 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

从容器内拷贝文件到宿主机

docker cp 容器id:文件路径 目标路径
[root@master ~]# docker exec -it fd6d05a53924 /bin/bash
[root@fd6d05a53924 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[root@fd6d05a53924 /]# cd home
[root@fd6d05a53924 home]# ls
[root@fd6d05a53924 home]# touch test_cp.py
[root@fd6d05a53924 home]# exit
exit
[root@master ~]# ls
[root@master ~]# docker cp fd6d05a53924:/home/test_cp.py .
[root@master ~]# ls
test_cp.py
[root@master ~]#

把容器提交为新的镜像

[root@master ~]# docker commit -m="add webapps" -a="answer" 15492c58c446 tomcat02:0.1
sha256:24a0db125365a955abae90cafa2bd0ff783fb3bf3a8c1b3bb06dd339ce1cf4f7
[root@master ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
tomcat02     0.1       24a0db125365   6 seconds ago   672MB

启动一个 nginx 容器

拉取镜像

docker pull nginx

查看镜像

[root@master ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    62d49f9bab67   2 days ago     133MB

启动容器

  • -d 后台运行
  • --name nginx01 给容器取名:nginx01
  • -p 3344:80 宿主机的端口 3344 : 容器的端口 80
  • nginx 镜像名称
docker run -d --name nginx01 -p 3344:80 nxinx

访问

curl locathost:3344

可以看到

Welcome to nginx!

启动一个 tomcat 容器

docker pull tomcat
docker run -d -p 3355:8080 --name tomcat01 tomcat
curl localhost:3355

可以看到

HTTP Status 404 – Not Found

进入容器,可以看到 webapps 目录是空的,因为阿里云默认使用精简版

[root@master ~]# docker exec -it tomcat01 /bin/bash
root@39287264ae30:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@39287264ae30:/usr/local/tomcat# cd webapps
root@39287264ae30:/usr/local/tomcat/webapps# ls
root@39287264ae30:/usr/local/tomcat/webapps#

继续

root@39287264ae30:/usr/local/tomcat/webapps# cd ..
root@39287264ae30:/usr/local/tomcat# ls
BUILDING.txt  CONTRIBUTING.md  LICENSE  NOTICE  README.md  RELEASE-NOTES  RUNNING.txt  bin  conf  lib  logs  native-jni-lib  temp  webapps  webapps.dist  work
root@39287264ae30:/usr/local/tomcat# cd webapps.dist/
root@39287264ae30:/usr/local/tomcat/webapps.dist# ls
ROOT  docs  examples  host-manager  manager
root@39287264ae30:/usr/local/tomcat/webapps.dist# cd ..
root@39287264ae30:/usr/local/tomcat# cp -r webapps.dist/* webapps
root@39287264ae30:/usr/local/tomcat# cd webapps
root@39287264ae30:/usr/local/tomcat/webapps# ls
ROOT  docs  examples  host-manager  manager
root@39287264ae30:/usr/local/tomcat/webapps# exit
exit

测试

[root@master ~]# curl localhost:3355

可以看到

Apache Tomcat/9.0.45

可视化

Portainer

Docker 图形化界面管理工具

启动

docker run -d -p 8088:9000 --restart=always -v /var/run/docker.sock:/var/run/docker.sock --privileged=true portainer/portainer

浏览器访问

宿主机ip:8088

容器数据卷

如果数据都在容器中,那么容器删除,数据就会丢失。

将容器中的数据,同步到宿主机。

方式一:使用 -v 挂载

-v 宿主机目录:容器目录
[root@master ~]# cd /home/
[root@master home]# ls
test_cp.py
[root@master home]# docker run -it -v /home/test:/home centos /bin/bash
[root@80f768d25851 /]# cd home/
[root@80f768d25851 home]# ls
[root@80f768d25851 home]# touch test_volum.py
[root@80f768d25851 home]# exit
exit
[root@master home]# ls
test  test_cp.py
[root@master home]# cd test
[root@master test]# ls
test_volum.py
[root@master test]#
[root@master test]# docker ps
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@master test]# ls
test_volume.py
[root@master test]# vim test_volume.py
[root@master test]# docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS                      PORTS     NAMES
80f768d25851   centos    "/bin/bash"              13 minutes ago   Exited (0) 6 minutes ago              awesome_tesla
[root@master test]# docker start 80f768d25851
80f768d25851
[root@master test]# docker attach 80f768d25851
[root@80f768d25851 /]# cd home/
[root@80f768d25851 home]# ls
test_volume.py
[root@80f768d25851 home]# cat test_volume.py
hello
[root@80f768d25851 home]#

启动一个 MySQL

docker pull mysql:5.7
docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=111111 --name mysql01 mysql:5.7

参数说明:

  • -d 后台运行
  • -p 指定端口
  • -v 挂载数据目录
  • -e 环境变量
  • --name 容器名称
[root@master home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=111111 --name mysql01 mysql:5.7
69bb40b3e7bbc6149f99cd3cd17c198fdabc9a5bdbe8cd0fc4f9c84f7beb8a06
[root@master home]# ls
mysql  test  test_cp.py
[root@master home]# cd mysql/
[root@master mysql]# ls
conf  data
[root@master mysql]# cd data/
[root@master data]# ls
auto.cnf  ca-key.pem  ca.pem  client-cert.pem  client-key.pem  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  ibtmp1  mysql  performance_schema  private_key.pem  public_key.pem  server-cert.pem  server-key.pem  sys

删除容器,宿主机中的数据仍然保留

[root@master data]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                               NAMES
69bb40b3e7bb   mysql:5.7   "docker-entrypoint.s…"   6 minutes ago   Up 6 minutes   0.0.0.0:3306->3306/tcp, 33060/tcp   mysql01
[root@master data]# docker stop 69bb40b3e7bb
69bb40b3e7bb
[root@master data]# docker rm 69bb40b3e7bb
69bb40b3e7bb
[root@master data]# ls
auto.cnf  ca-key.pem  ca.pem  client-cert.pem  client-key.pem  ib_buffer_pool  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  private_key.pem  public_key.pem  server-cert.pem  server-key.pem  sys
[root@master data]#

方式二:使用在 dockerfile 使用 VOLUME 挂载

vim dockerfile1
FROM centos
VOLUME ["volume1", "volume2"]
CMD echo "end"
CMD /bin/bash
docker build -f dockerfile1 -t mycentos:0.1 .

启动容器

docker run -it 87b2df5c7bb0 /bin/bash

可以看到容器内挂载的目录

[root@76303fbcb383 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@76303fbcb383 /]# exit

查看容器的详细信息

docker inspect 76303fbcb383

通过 Mounts 字段可以看到挂载信息

"Mounts": [
            {
                "Source": "/var/lib/docker/volumes/bc13741cae8d3adae4b0aab90f9f82bf2b0e647a20856fd7f426781c4ce9db9c/_data",
                "Destination": "volume1",
            },
            {
                "Source": "/var/lib/docker/volumes/7a4ad4719df0a613b8a48900761db0ec5fbd6d39d962af7390ad31bfce8e3cad/_data",
                "Destination": "volume2",
            }
        ],

容器与容器之间数据同步

[root@master ~]# docker run -it --name container1 87b2df5c7bb0
[root@2ca2d156346b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@2ca2d156346b /]# ls[root@master ~]#
[root@master ~]#
[root@master ~]# docker run -it --name container2 --volumes-from container1  87b2df5c7bb0
[root@8a64e695517e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@8a64e695517e /]# [root@master ~]#
[root@master ~]#
[root@master ~]# docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED              STATUS              PORTS     NAMES
8a64e695517e   87b2df5c7bb0   "/bin/sh -c /bin/bash"   About a minute ago   Up About a minute             container2
2ca2d156346b   87b2df5c7bb0   "/bin/sh -c /bin/bash"   3 minutes ago        Up 3 minutes                  container1
[root@master ~]# docker exec -it container1 /bin/bash
[root@2ca2d156346b /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@2ca2d156346b /]# cd volume1/
[root@2ca2d156346b volume1]# ls
[root@2ca2d156346b volume1]# touch hello.py
[root@2ca2d156346b volume1]# ls
hello.py
[root@2ca2d156346b volume1]# exit
exit
[root@master ~]# docker exec -it container2 /bin/bash
[root@8a64e695517e /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume1  volume2
[root@8a64e695517e /]# cd volume1
[root@8a64e695517e volume1]# ls
hello.py
[root@8a64e695517e volume1]# exit
[root@8a64e695517e volume1]# exit
exit
[root@master ~]#

DockerFile

指令

基础镜像

FROM

维护者

MAINTAINER

添加内容

ADD

将文件拷贝到镜像中

COPY

环境变量

ENV

镜像构建的时候,需要做什么

RUN

镜像的工作目录

WORKDIR

数据挂载目录

VOLUME

暴露的端口号

EXPOSE

容器启动的时候运行的命令,只有最后一个会生效,而且可以被替代

CMD

容器启动的时候运行的命令,可以追加命令

ENTRYPOINT

构建一个新的 centos 镜像

编写 dockerfile

vim dockerfile1
FROM centos
MAINTAINER answer

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum install vim -y
RUN yum install net-tools -y

EXPOSE 80

CMD echo $MYPATH
CMD echo "end"
CMD /bin/bash

构建镜像

docker build -f dockerfile1 -t newcentos:1.0 .

运行

[root@master dockerfile]# docker run -it newcentos:1.0
[root@8d82303293e1 local]# pwd
/usr/local

CMD 和 ENTRYPOINT 的区别

vim test_cmd
FROM centos
CMD ["ls", "-a"]
docker build -f test_cmd -t testcmd .

运行

[root@master dockerfile]# docker run testcmd
.
..
.dockerenv
bin
dev
etc
home
lib
略...

可以看到启动容器,并且执行了 ls -a

如果在运行容器的时候,追加一个参数 l ,使容器启动并执行 ls -al

docker run testcmd -l

会报错,因为会用 -l 替换掉 ls -a

[root@master dockerfile]# docker run testcmd -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:367: starting container process caused: exec: "-l": executable file not found in $PATH: unknown.

再来看下 ENTRYPOINT

vim test_entrypoint
FROM centos
ENTRYPOINT ["ls", "-a"]
docker build -f test_entrypoint -t testentrypoint .
[root@master dockerfile]# docker run testentrypoint
.
..
.dockerenv
bin
dev
略...

追加参数运行,是可以的

[root@master dockerfile]# docker run testentrypoint -l
total 56
drwxr-xr-x  1 root root 4096 Apr 17 11:10 .
drwxr-xr-x  1 root root 4096 Apr 17 11:10 ..
-rwxr-xr-x  1 root root    0 Apr 17 11:10 .dockerenv
lrwxrwxrwx  1 root root    7 Nov  3 15:22 bin -> usr/bin
drwxr-xr-x  5 root root  340 Apr 17 11:10 dev
略...
[root@master dockerfile]# cat test_entrypoint
FROM centos
ENTRYPOINT ["ls", "-a"]

制作一个 Tomcat 镜像

  1. 准备 Tomcat 压缩包和 JDK 压缩包

    [root@master tomcat]# pwd
    /home/dockerfile/tomcat
    [root@master tomcat]# ls
    apache-tomcat-9.0.45.tar.gz  jdk-8u281-linux-x64.tar.gz
    [root@master tomcat]# touch readme.md
    [root@master tomcat]# ls
    apache-tomcat-9.0.45.tar.gz  jdk-8u281-linux-x64.tar.gz  readme.md
    
  2. vim Dockerfile

  3. FROM centos
    MAINTAINER answer
    
    COPY readme.md /usr/local/readme.md
    
    ADD jdk-8u281-linux-x64.tar.gz /usr/local/
    ADD apache-tomcat-9.0.45.tar.gz /usr/local/
    
    RUN yum install vim -y
    
    WORKDIR /usr/local
    
    ENV JAVA_HOME /usr/local/jdk1.8.0_281
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/bin/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.45
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.45
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/bin:$CATALINA_HOME/lib
    
    EXPOSE 8080
    
    CMD /usr/local/apache-tomcat-9.0.45/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.45/logs/catalina.out
    
  4. docker build -t newtomcat .

  5. docker run -d -p 8080:8080 --name mytomcat -v /home/dockerfile/tomcat/test:/usr/local/apache-tomcat-9.0.45/webapps/test -v /home/dockerfile/tomcat/tomcatlogs:/usr/local/apache-tomcat-9.0.45/logs newtomcat
    

Docker 网络

删除所有容器,使用:

docker rm -f $(docker ps -aq)

删除所有镜像,使用:

docker rmi -f $(docker images -aq)

网络模式

  • bridge 桥接模式(默认)

    容器1 eth0 容器2 eth0

    veth| | veth

        docker0
    
             | 
    
      宿主机 eth0 
    
  • host 和宿主机共享网络

    容器1 eth0 容器2 eth0

       |             |veth
    
     |      docker0
    
     |             | 
    

    宿主机 eth0

  • container 容器网络连通

    容器1 eth0 -- 容器2 eth0

    veth|

    docker0

        | 
    

    宿主机 eth0

  • none 不配置网络

在宿主机上查看网络地址:

ip addr

可以看到,宿主机

eth0

和 Docker

docker0

启动一个 Tomcat 容器

docker run -d -P --name tomcat01 tomcat

查看容器内部的网络地址

docker exec -it tomcat01 ip addr

可以看到,容器内的网卡

94: eth0@if95

启动容器之后,再查看一下宿主机的网络地址

ip addr

可以看到,多了一个

95: veth948bb03@if94

宿主机多出来的这个网卡,和容器内的网卡是一对虚拟网卡。每启动一个容器,就会成对出现一对虚拟网卡。

再启动一个 Tomcat 容器

docker run -d -P --name tomcat02 tomcat

然后看一下宿主机的网络地址,可以看到,多了一个

97: veth6211866@if96

然后看一下 tomcat02 容器的网络地址,可以看到与宿主机上面成对的虚拟网卡

96: eth0@if97

容器之间也是可以 ping 通的

docker exec -it tomcat02 ping tomcat01的ip

docker0 通过成对的虚拟网卡 veth 找到对应的容器。

测试 host 模式

启动一个容器,tomcat01 ,使用 host 模式

docker run -d --name tomcat02 --network host tomcat

查看宿主机的网络地址

ip addr

查看 tomcat01 的网络地址,发现容器 tomcat1 和宿主机的网络地址,完全一样

docker exec -it tomcat01 ip addr

测试 container 模式

启动一个 tomcat 容器,tomcat02,使用默认的 bridge 模式

docker exec -it tomcat01 ip addr

再启动一个 tomcat 容器,tomcat03,使用 container 模式

docker run -it -d --name tomcat03 --network container:tomcat02 tomcat /bin/bash

查看 tomcat02 和 tomcat03 的网络地址,发现两个容器的网络地址,完全一样

docker exec -it tomcat02 ip addr
docker exec -it tomcat03 ip addr

--link

再启动一个 tomcat 容器 tomcat03,添加 --link 参数

docker run -d -P --name tomcat03 --link tomcat02 tomcat

启动成功之后,可以使用容器名称 ping tomcat02

docker exec -it tomcat03 ping tomcat02

自定义网络

让容器使用自己创建的网络,而不是 docker0

创建

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

查看

docker network ls

可以看到

NETWORK ID     NAME      DRIVER    SCOPE
172e0e7e1cc4   bridge    bridge    local
cbda15f5f707   host      host      local
90a69af90650   mynet     bridge    local
62686a15ab53   none      null      local

查看

docker network inspect mynet

可以看到

"Subnet": "192.168.0.0/16",
"Gateway": "192.168.0.1"

启动两个 tomcat ,指定使用自己创建的网络

docker run -d -P --name tomcat01 --net mynet tomcat
docker run -d -P --name tomcat02 --net mynet tomcat

不用使用 --link 参数,直接使用容器名 ping,也可以 ping 通

docker exec -it tomcat01 ping tomcat02

网络连通

前面创建的 tomcat01 和 tomca02 使用的是自己创建的网络 mynet

现在再启动两个 tomcat 容器,tomcat03 和 tomcat 04,使用默认的 docker0 网络

docker run -d -P --name tomcat03 tomcat
docker run -d -P --name tomcat04 tomcat
[root@master ~]# docker ps
CONTAINER ID   IMAGE     COMMAND             CREATED          STATUS          PORTS                     NAMES
4fc11602276a   tomcat    "catalina.sh run"   41 seconds ago   Up 40 seconds   0.0.0.0:32775->8080/tcp   tomcat04
0c8e848c7141   tomcat    "catalina.sh run"   48 seconds ago   Up 48 seconds   0.0.0.0:32774->8080/tcp   tomcat03
c176da0abbcb   tomcat    "catalina.sh run"   14 minutes ago   Up 14 minutes   0.0.0.0:32773->8080/tcp   tomcat02
4dbe9800ee75   tomcat    "catalina.sh run"   14 minutes ago   Up 14 minutes   0.0.0.0:32772->8080/tcp   tomcat01
[root@master ~]#

现在使用 tomcat03 ping tomcat02 是不行的

[root@master ~]# docker exec -it tomcat03 ping tomcat02
ping: tomcat02: Name or service not known

把 tomcat03 连接到 mynet ,这样 tomcat02 这个容器,就有了两个 ip 地址

docker network connect mynet tomcat03

再试一下,就可以了

[root@master ~]# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (192.168.0.3) 56(84) bytes of data.
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.052 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.053 ms
64 bytes from tomcat02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.055 ms

Docker Compose

Compose 是 Docker 官方的开源项目,用于定义、运行多个容器,使用 YAML 配置文件。

使用三个步骤:

  1. 定义 Dockerfile
  2. 定义 docker-compose.yml
  3. 运行 docker-compose up

安装

下载

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

下载完成之后,查看一下,/usr/local/bin 目录下有 docker-compose 表示下载成功

cd /usr/local/bin/
[root@master bin]# ls
chardetect  cloud-id  cloud-init  cloud-init-per  docker-compose  easy_install  easy_install-3.6  jsondiff  jsonpatch  jsonpointer  jsonschema

授权

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

验证一下

docker-compose version

试玩

  1. 创建项目目录

    cd /home
    mkdir composetest
    cd composetest/
    
  2. 创建 app.py

    vim 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. 创建依赖文件

    vim requirements.txt
    
    flask
    redis
    
  4. 创建 Dockerfile

    vim Dockerfile
    
    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"]
    
  5. 创建 docker-compose.yml

    vim docker-compose.yml
    
    version: "3.9"
    services:
      web:
        build: .
        ports:
          - "5000:5000"
      redis:
        image: "redis:alpine"
    
  6. 启动

    docker-compose up
    
  7. 浏览器访问

    宿主机ip:5000
    

    可以看到

    Hello World! I have been seen 1 times.
    
  8. 退出:CTRL+C

查看一下

容器

[root@master ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                  CREATED         STATUS         PORTS                    NAMES
1cb56e501eb5   composetest_web   "flask run"              8 minutes ago   Up 8 minutes   0.0.0.0:5000->5000/tcp   composetest_web_1
c5bb4070402e   redis:alpine      "docker-entrypoint.s…"   8 minutes ago   Up 8 minutes   6379/tcp                 composetest_redis_1

镜像

[root@master ~]# docker images
REPOSITORY        TAG          IMAGE ID       CREATED          SIZE
composetest_web   latest       5e92df4e8e8d   11 minutes ago   182MB
python            3.7-alpine   c46f62f378d7   4 days ago       41.6MB
redis             alpine       d6121e6a8ceb   4 days ago       32.3MB

网络

[root@master ~]# docker network ls
NETWORK ID     NAME                  DRIVER    SCOPE
172e0e7e1cc4   bridge                bridge    local
cbfd10c9cd59   composetest_default   bridge    local
cbda15f5f707   host                  host      local
62686a15ab53   none                  null      local
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容