美文网首页Docker容器
Docker使用学习

Docker使用学习

作者: 我只要喝点果粒橙 | 来源:发表于2020-02-04 11:39 被阅读0次

    轻部署,省成本,易迁移

    docker和虚拟机VM的区别

    一、本质上的区别:

    image

    VM(VMware)在宿主机器、宿主机器操作系统的基础上创建虚拟层、虚拟化的操作系统、虚拟化的仓库,然后再安装应用;

    Container(Docker容器),在宿主机器、宿主机器操作系统上创建Docker引擎,在引擎的基础上再安装应用。

    那么问题来了,没有操作系统,怎么运行程序?

    可以在Docker中创建一个ubuntu的镜像文件,这样就能将ubuntu系统集成到Docker中,运行的应用就都是ubuntu的应用。

    二、使用上的区别:

    image

    Size:

    • 虚拟机ubuntu大小为:24.1GB
    • Docker中镜像文件占用内存: 81.2MB

    Startup:

    • Docker在宿主机器的操作系统上创建Docker引擎,直接在宿主主机的操作系统上调用硬件资源,而不是虚拟化操作系统和硬件资源,所以操作速度快。
    • 这个其实安装一个ubuntu的虚拟机和拉取一个Docker的ubuntu镜像文件,运行一下就知道了,区别很明显,虚拟机开一下大概得2分多钟,而Docker只需要2秒钟。

    宿主机、镜像与容器

    宿主机器: 运行docker的机器

    镜像:不可以修改内容

    容器:可以修改能内容,相当于虚拟机,默认情况下彼此相互独立(容器之间可以通信)

    △.可以依据镜像来创建容器,也可以封装容器为一个镜像,即容器<===>镜像

    Docker命令

    搜索镜像: docker search python

    下载镜像: docker pull NAME

    创新容器: docker run -tid (--name xxx) IMAGE ID

    • ti表示以交互的形式创建容器,d表示不进入
      • -d, --detach=false, 指定容器运行于前台还是后台,默认为false
      • -i, --interactive=false, 打开STDIN,用于控制台交互
      • -t, --tty=false, 分配tty设备,该可以支持终端登录,默认为false

    运行容器: docker start CONTAINER_ID

    进入容器: docker attach CONTAINER_ID

    • 进入容器前得前运行容器

    退出容器: ctrl + p + q , 以ctrl + zexit将会终止容器运行

    封装容器为镜像: docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

    -a :提交的镜像作者;
    -c :使用Dockerfile指令来创建镜像;
    -m :提交时的说明文字;
    -p :在commit时,将容器暂停。
    

    容器通信-创建子节点链接中心节点: docker run -tid (--name xxx) (--link CONTAINER_NAMES) IMAGE ID

    查看容器ip: cat /ect/hosts

    root@b68943564e76:/# 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.2  test 4e02c004539e
    172.17.0.3  b68943564e76
    

    ▲初次使用, ifconfig使用无效,ping也无效,原因如下

    我创建的容器是拉取的Base镜像,而因为用Docker拉取的Base镜像如Centos和Ubuntu的话都是最简版本,不包含Ping工具,而对Docker进行Docker network和Docker链接操作时往往要用到Ping工具测试两个容器间的网络,此时就要用到Ping工具了,下面是Ubuntu下安装Ping工具的命令:apt-get update && apt-get install iputils-ping、安装ifconfig工具:apt install net-tools

    从容器里面拷文件到宿主机

    docker cp 容器名:要拷贝的文件在容器里面的路径 要拷贝到宿主机的相应路径

    宿主机上执行:$ docker cp testtomcat:/usr/local/tomcat/webapps/test/js/test.js /opt

    从宿主机拷文件到docker容器里面

    docker cp 要拷贝的文件路径 容器名:要拷贝到容器里面对应的路径

    宿主机上执行$ docker cp requirements.txt apptest:/app

    ▲注:容器NAME可以通过docker ps命令查看

    Dockerfile指令

    Dockerfile文件D一定要大写

    $ docker build -t="dormanctpress/df_test2" .

    • .为Dockerfile的路径

    1.FROM <image>:<tag>

    2.MAINTAINER

    3.RUN

    • 镜像构建中运行的命令

    4.EXPOSE

    • 如果是端口的话,只是声明会使用xx端口,但是实际使用时还是需要run -p xx $ docker build -t="dormanctpress/df_test2" .
    • 设置环境变量

    CMD

    • 在容器运行时运行的默认命令(命令行中添加的命令可以代替掉Dokcerfile中写的CMD指令)
    • 每个Dockerfile只能够包含一个CMD,多个CMD 只有最后一个能有效
    • 定义的三种方式
      • CMD<cmd>这个会当做/bin/sh-c“cmd”来执行
      • CMD[“executable","arg1","arg2"]
        • 一定要双引号
      • CMD[“arg1","arg2"],这个时候CMD作为ENTRYPOINT的参数

    ENTRYPOINT

    • 每个Dockerfile只能够包含一个ENTRYPOINI,多个ENTRYPOINT只有最后一个能有效

    • 不会像CMD命令一样被覆盖,除非使用``

    • 当定义了ENTRYPOINT后,CMD将被作为参数使用。如果定义了CMD,那么docker run -t test/osf2 xxxx后面即xxxx的内容全会被当做参数传递ENTRYPOINT

    组合使用ENTRYPOINT和CMD: ENTRYPOINT指定命令,CMD指定默认参数

    ADD&COPY

    共同点

    • ADD&COPY的源必须在context路径下

    • 当在源代码构建的方式下,可以通过ADD和COPY的方式,把Host上的文件或者目录复制到Image

      ADD

    • 包含类似tar解压的功能

    • 当src为网络URL的情况下,ADD指令可以把它下载到Dest的指定位置,这个在任何build的方式下都可以Work

    COPY

    • 如果单纯复制文件,Docker推荐COPY
    • ADD&COPY的源必须在context路径下
    • 当在源代码构建的方式下,可以通过ADD和COPY的方式,把Host上的文件或者目录复制到Image

    VOLUME['/data']

    • 设置数据卷

    WORKDIR /path/to/workdir

    • 一般使用绝对路径

    ENV <key> <value>

    • 用来设置环境变量,后续的RUN可以使用它所创建的环境变量。
    • 当创建基于该镜像的Container的时候,会自动拥有设置的环境变量

    USER daemon

    • 指定UID或者username,来决定运行RUN指令的用户

    • 如果不指定,则默认root

    ONBUILD

    • 触发器

    dockerfile构建过程

    1. 从基础镜像运行一个容器
    2. 执行一条指令,对容器做出修改
    3. 执行类似docker commit的操作,提交一个新的镜像层
    4. 再基于刚提交的镜像运行一个新容器
    5. 执行Dockerfile中的下一条指令,直至所有指令执行完毕

    使用中间层镜像进行调试

    查找错误

    Dockerfile 镜像缓存

    构建缓存:将之前的镜像缓存

    不使用缓存docker build --no-cache

    查看镜像构建的过程

    查看构建过程:docker history xxx/yyy

    数据卷

    sudo docker run -v ~/container_data:/data -it ubuntu /bin/bash

    参数说明:使用-v选项,第一个参数为宿主机目录,:后的目录为在容器中使用的目录(挂载);ubuntu为镜像

    查看容器是否挂载了数据卷

    docker inspect CONTAINER_ID可以查看容器是否挂载了数据卷

    给数据卷增加权限

    sudo docker run -v ~/datavolume:/data:ro -it ubuntu/bin/bash

    ro是read-only

    数据卷容器

    命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器

    挂载数据卷容器的方法

    docker run--volumes-from [CONTAINER NAME]

    MySQL通信

    >>> can't connect to MySQL server on '172.17.0.8'(111)
    $ vim /etc/mvsal/my.cnf 
    # 将bind-address=127.0.0.1注释掉
    >>> Host '2eaf92ef2ff6'is not allowed to connect to this MySQL server
    $ create user "weiwei"@"%"identified by"weijc7789"
    # 创建用户
    $ grant create, select, update, delete, insert on *.* to weiwei;
    # 增添权限
    $ mysq1-h 172.17.0.8-u weiwei-p
    # 链接
    

    redis通信

    $ redis-cli -h 172.17.0.8
    >>> Could not connect to Redis at 172.17.0.8:6379:Connection refused
    $ vim /etc/redis /redis.conf
    # 将bind-address=127.0.0.1注释掉
    
    # 如果修改后/ect/init.d/redis-server restart后还是链接不了,重启进入容器
    $ redis-cli-h 172.17.0.8-p 6379
    

    一条命令实现停用并删除容器:

    docker stop $(docker ps -q) & docker rm $(docker ps -aq)
    

    一条命令删除所有镜像:

    docker rmi `docker images -q`
    

    一条命令删除创建失败的镜像:

    docker images | sed -n '2p' | awk '{print$3}' | xargs docker rmi

    附录

    Dockerfile RUN,CMD,ENTRYPOINT命令区别

    RUN命令执行命令并创建新的镜像层,通常用于安装软件包

    CMD命令设置容器启动后默认执行的命令及其参数,但CMD设置的命令能够被docker run命令后面的命令行参数替换

    ENTRYPOINT配置容器启动时的执行命令(不会被忽略,一定会被执行,即使运行 docker run时指定了其他命令)

    Shell格式和Exec格式运行命令

    我们可用两种方式指定 RUN、CMD 和 ENTRYPOINT 要运行的命令:Shell 格式和 Exec 格式:

    • Shell格式:<instruction> <command>。例如:apt-get install python3
      • 多条命令用&&链接
    • Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]

    CMD 和 ENTRYPOINT 推荐使用 Exec 格式,因为指令可读性更强,更容易理解。RUN 则两种格式都可以。

    总结

    • 使用 RUN 指令安装应用和软件包,构建镜像。
    • 如果 Docker 镜像的用途是运行应用程序或服务,比如运行一个 MySQL,应该优先使用 Exec 格式的 ENTRYPOINT 指令。CMD 可为 ENTRYPOINT 提供额外的默认参数,同时可利用 docker run 命令行替换默认参数。
    • 如果想为容器设置默认的启动命令,可使用 CMD 指令。用户可在 docker run 命令行中替换此默认命令。

    Docker 运行python flask的web程序

    1创建镜像

    1.1 ubuntu16.04+python3.6

    18.04卡在了PPA环节,并且git安装也没安装上,后来使用了dockerHub上搜素到的github仓库中的16.04 Xenial就解决了。

    注:镜像TAG版本需要到dockerHub上才能查看,最初下载成18.04就是因为这个原因被坑了

    18.04PPA问题:

    aptsources.distro.NoDistroTemplateException: Error: could not find a distribution template for Ubuntu/bionic意思是18.04该PPA没有资源.bionic是版本代号,如16.04的 Xenial

    ⑴使用下载好的Xenial的Dockerfile进行创建镜像docker run 1604ubuntu .

    为了使用国内源用阿里云,先编辑一个sources.list,放在dokcerfile同目录下,作为docker创建镜像时的上下文。

    deb-src http://archive.ubuntu.com/ubuntu xenial main restricted #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-updates multiverse
    deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse #Added by software-properties
    deb http://archive.canonical.com/ubuntu xenial partner
    deb-src http://archive.canonical.com/ubuntu xenial partner
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted
    deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted multiverse universe #Added by software-properties
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
    deb http://mirrors.aliyun.com/ubuntu/ xenial-security multiverse
    

    ⑵根据官方的镜像来编写自己的Dockerfile创建具有工具的Ubuntu1604

    涉及交互式选择项(如下),docker build的时候会报错。设置 DEBIAN_FRONTEND=noninteractive

    FROM 1604ubuntu
    MAINTAINER mrli
    #用ubuntu国内源替换默认源
    RUN rm /etc/apt/sources.list
    COPY sources.list /etc/apt/sources.list
    
    #安装python3.6必要的包。源镜像太精简了,ip ifconfig之类的都没有。后续安装python pip也需要一些。但是build_essential似乎不必须,先去了。如果后面安装numpy之类需要gcc了,再加上
    RUN apt update
    #RUN apt upgrade
    
    RUN apt install -y apt-utils apt-transport-https  vim iproute2 net-tools ca-certificates curl build-essential wget python-software-properties software-properties-common psmisc
    
    #安装python3.6 来自第三方
    RUN add-apt-repository ppa:jonathonf/python-3.6
    RUN apt update
    RUN apt install -y python3.6
    RUN apt install -y python3.6-dev
    RUN apt install -y python3.6-venv
    
    #为3.6安装pip
    RUN wget https://bootstrap.pypa.io/get-pip.py
    RUN python3.6 get-pip.py
    
    #设置默认python为python3
    RUN update-alternatives --install /usr/bin/python python /usr/bin/python2 100
    RUN update-alternatives --install /usr/bin/python python /usr/bin/python3 150
    
    #和自带的3.5共存,设置python3默认为3.6
    #RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1
    RUN update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2
    
    # 更新配置
    RUN update-alternatives --config python3
    #print()时在控制台正常显示中文
    ENV PYTHONIOENCODING=utf-8
    
    

    在dockerfile所在路径下执行,建立image

    docker build -t uos:1604 .
    

    因为开头几步用了国内源,所以非常快。

    1.2 开发环境

    再建一个dockerfile,开头使用刚才建立的镜像uos1604

    FROM uos:1604
    MAINTAINER mrli
    
    #代码复制过来后的路径
    RUN mkdir /app
    # 指定容器启动时执行的命令都在app目录下执行
    WORKDIR /app
    
    # 将本地app目录下的内容拷贝到容器的app目录下
    COPY ./app/ /app/
    
    # 安装nginx
    RUN apt -y install nginx mysql-server 
    
    RUN /etc/init.d/nginx start
    # 替换nginx的配置
    RUN rm  /etc/nginx/sites-enabled/default
    RUN cp nginx.conf /etc/nginx/sites-enabled/nginx.conf
    
    RUN pip3 install uwsgi
    
    #安装需要的python库
    # 启动nginx和uwsgi
    #ENTRYPOINT pip install -r requirements.txt  -i  https://pypi.tuna.tsinghua.edu.cn/simple some-package --no-cache-dir && service nginx restart && uwsgi --ini uwsgi.ini
    
    # 为了保证能之后进入所以最后一个命令为/bin/sh
    ENTRYPOINT pip install -r requirements.txt  -i  https://pypi.tuna.tsinghua.edu.cn/simple some-package --no-cache-dir && service nginx restart && uwsgi --ini uwsgi.ini & && /bin/sh
    
    
    

    创建uflask镜像:docker build -t uflask .

    根据镜像创建运行容器:docker run -tid -p 12345:80 flaskdemo IMAGE_ID

    此时就可以通过VPS的IP地址:宿主机端口访问这个应用程序

    查看日志:docker logs 应用名(NAMES)docker logs flaskdemo

    关于mysql的建议

    mysql建议作为单独容器来跑数据库,然后远程连接数据库.或是使用数据卷

    # 
    # 搜索
    # docker search mysql
    # 拉取
    # docker pull mysql:5.7
    #运行
    # docker run --name mysql5.7 -e MYSQL_ROOT_PASSWORD=123456 -p 3307:3306 -d mysql:5.7
    

    2启动容器(转)

    • Docker

      一种开源容器应用,供开发者打包自己的开发环境,可以任意移植

    • docker-compose
      一种管理多个Docker容器的工具,可以简化我们启动容器的各种命令
    2.1手动敲docker命令

    先试试用docker命令行启动容器:

    docker run --name quotation_api -itd -p 5000:5000 -v /home/quotation:/code quotation_dev:latest
    

    用到的参数分别是

    --name为容器命名;

    -itd 输入输出终端,后台运行

    -p host端口:容器端口

    • 将宿主机5000端口的请求转发到容器5000端口,用5000是flask默认

    -v host路径:容器内路径(挂载数据卷)

    quotation_dev:latest 最后是使用的镜像名(前面刚用dockerfile build出来的)

    然后进入容器

    docker attach quotation_api
    

    用python3 main.py启动flask,OK。

    这样flask运行在docker里了。

    在host改代码,可以看见docker的控制台在更新,和在host一样了。(使用数据卷)

    2.2使用dock-compose

    如果没有安装先进行安装apt install docker-compose

    dock-compose用来管理多个container的运行,特别适合1个host上跑多个container的情况。

    得天独厚,docker官网上dock-compose的gettingstarted文档就是flask的(说明flask+docker代表了先进生产力的前进方向O Yeah!),看完了基本就能用了。

    dock-compose采用yaml作为配置文件。查了一下,yaml参考了xml和json,以及python的语法,采用了python之缩进,无XML之标记,无json之括号,无字符串之引号。特别适合作为配置文件用。

    建立docker-compose.yaml文件(无镜像,但有dockerfile):

    version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file
    services:
      docker-demo:  # 指定服务名称
        build: .  # 指定 Dockerfile 所在路径
        ports:    # 指定端口映射
          - "9000:8761"
    

    建立docker-compose.yaml文件(已有镜像):

    version: "3"
    
    services:
      quotation_api:    # 指定服务名称
        image: quotation_dev:latest  # 指定镜像
        volumes:        # 选择数据卷
          - /home/quotation:/code
        ports:          # 端口映射
          - "5000:5000"
        command: python3 main.py    # 执行命令
    

    基本对应手动敲的docker命令,最后还省了敲python3 main.py。

    当然如果是部署,这句可以用CMD 写进Dockfile。但是开发过程,文件名之类的会改变,比如最终部署运行用可能是gunicorn+wsgi.py,所以还是写在dockerfile外面比较方便

    运行,在控制台执行:docker-compose updocker-compose up -d // 后台启动并运行容器

    docker-compose更多介绍

    坑点记录

    docker容器启动后马上退出解决方案

    dokcerfile中的最后一个命令不能在后台执行,不然会启动后马上退出

    原因

    Docker容器同时只能管理一个进程,如果这个进程退出那么容器也就退出了,但这不表示容器只能运行一个进程(其他进程可在后台运行),但是要使容器不退出必须有一个前台执行的进程。

    解决方法

    脚本中最后一个进程一定要用前台运行方式即在进程最后不加&(&表示后台运行),否则容器会退出。

    如何正确的使用docker attach

    Q:由于执行着uwsgi --ini uwsig.ini命令,用户就无法直接进入到容器中去,docker attach CONTAINER_id 就会一直卡着。

    A: attach早已过时了,可用: docker exec -it containerID /bin/bash,一开始使用的是/bin/sh然后还是一直卡住.但是/bin/bash是可以的

    附Uuntu版本代号:

    版本号 代号 发布时间
    18.04 Bionic Beaver(仿生海狸) 即将发布2018年4月(LTS)
    17.10 Artful Aardvark(机灵的土豚) 2017年10月
    16.04 LTS Xenial Xerus 好客的非洲地松鼠 即将发布 2016/4
    15.10 Wily Werewolf 狡诈的狼人 2015/10/22
    15.04 Vivid Vervet 活泼的小猴 2015/04/23
    14.10 Utopic Unicorn 乌托邦独角兽 2014/10/23
    14.04 LTS Trusty Tahr 值得信赖的塔尔羊 2014/04/18
    13.10 Saucy Salamander 活泼的蝾螈 2013/10/17
    13.04 Raring Ringtail 铆劲浣熊 2013/04/25
    12.10 Quantal Quetzal 缤纷的绿咬鹃 2012/10/18
    12.04 LTS Precise Pangolin 精准的穿山甲 2012/04/26
    11.10 Oneiric Ocelot 有梦的虎猫 2011/10/13
    11.04 Unity成为默认桌面环境 Natty Narwhal 敏捷的独角鲸 2011/04/28
    10.10 Maverick Meerkat 标新立异的的狐獴 2010/10/10
    10.04 LTS Lucid Lynx 清醒的猞猁 2010/04/29
    9.10 Karmic Koala 幸运的无尾熊 2009/10/29
    9.04 Jaunty Jackalope 活泼的兔子 2009/04/23
    8.10 Intrepid Ibex 无畏的高地山羊 2008/10/30
    8.06 官方查不到此版本发布信息 Haughty Husky 骄傲的哈士奇 2008/06/07
    8.04 LTS Hardy Heron 坚强的苍鹭 2008/04/24
    7.10 Gutsy Gibbon 勇敢的长臂猿 2007/10/18
    7.04 Feisty Fawn 烦躁不安的小鹿 2007/04/19
    6.10 Edgy Eft 尖利的小蜥蜴 2006/10/26
    6.06 LTS Dapper Drake 整洁的公鸭 2006/06/01
    5.10 Breezy Badger 活泼的獾 2005/10/13
    5.04 Hoary Hedgehog 白发得刺猬 2005/04/08
    **4.10 **初始发布版本 Warty Warthog 多疣的疣猪 2004/10/20

    docker-compose使用[转]

    docker-compose常见命令

    • ps:列出所有运行容器
    docker-compose ps
    
    • logs:查看服务日志输出
    docker-compose logs
    
    • port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口
    docker-compose port eureka 8761
    
    • build:构建或者重新构建服务
    docker-compose build
    
    • start:启动指定服务已存在的容器
    docker-compose start eureka
    
    • stop:停止已运行的服务的容器
    docker-compose stop eureka
    
    • rm:删除指定服务的容器
    docker-compose rm eureka
    
    • up:构建、启动容器
    docker-compose up
    
    • kill:通过发送 SIGKILL 信号来停止指定服务的容器
    docker-compose kill eureka
    
    • pull:下载服务镜像
    • scale:设置指定服务运气容器的个数,以 service=num 形式指定
    docker-compose scale user=3 movie=3
    
    • run:在一个服务上执行一个命令
    docker-compose run web bash
    

    docker-compose.yml 字段含义

    • version:指定 docker-compose.yml 文件的写法格式
    • services:多个容器集合
    • build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数
    build: ./dir
    ---------------
    build:
        context: ./dir
        dockerfile: Dockerfile
        args:
            buildno: 1
    
    • command:覆盖容器启动后默认执行的命令
    command: bundle exec thin -p 3000
    ----------------------------------
    command: [bundle,exec,thin,-p,3000]
    
    • dns:配置 dns 服务器,可以是一个值或列表
    dns: 8.8.8.8
    ------------
    dns:
        - 8.8.8.8
        - 9.9.9.9
    
    • dns_search:配置 DNS 搜索域,可以是一个值或列表
    dns_search: example.com
    ------------------------
    dns_search:
        - dc1.example.com
        - dc2.example.com
    
    • environment:环境变量配置,可以用数组或字典两种方式
    environment:
        RACK_ENV: development
        SHOW: 'ture'
    -------------------------
    environment:
        - RACK_ENV=development
        - SHOW=ture
    
    • env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量
    env_file: .env
    ---------------
    env_file:
        - ./common.env
    
    • expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机
    expose:
        - "3000"
        - "8000"
    
    • image:指定服务所使用的镜像
    image: java
    
    • network_mode:设置网络模式
    network_mode: "bridge"
    network_mode: "host"
    network_mode: "none"
    network_mode: "service:[service name]"
    network_mode: "container:[container name/id]"
    
    • ports:对外暴露的端口定义,和 expose 对应
    ports:   # 暴露端口信息  - "宿主机端口:容器暴露端口"
    - "8763:8763"
    - "8763:8763"
    
    • links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况
    links:    # 指定服务名称:别名 
        - docker-compose-eureka-server:compose-eureka
    
    • volumes:卷挂载路径
    volumes:
      - /lib
      - /var
    
    • logs:日志输出信息
    --no-color          单色输出,不显示其他颜.
    -f, --follow        跟踪日志输出,就是可以实时查看日志
    -t, --timestamps    显示时间戳
    --tail              从日志的结尾显示,--tail=200
    

    更新容器

    • 当服务的配置发生更改时,可使用 docker-compose up 命令更新配置
    • 此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去

    links

    • 服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务
    version: '2'
    services:
        web:
            build: .
            links:
                - "db:database"
        db:
            image: postgres
    
    • 这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了

    docker stop containerID,以后再重新启动时报错

    Error response from daemon: driver failed programming external connectivity on endpoint app (3c0c01ac6b42b7a420644fc2b4debfbbcc0e1d2e74e6294155c28aca82f794c4):  (iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 12345 -j DNAT --to-destination 172.17.0.2:80 ! -i docker0: iptables: No chain/target/match by that name.
    

    A: 重启docker即可:systemctl restart docker

    再开启你的容器: docker run xxxxdocker start xxx

    查看docker容器的运行日志

    docker logs containerID

    docker端口映射到宿主机后外网仍无法访问容器的web

    A:

    # 解决办法:
    $ sudo vi /etc/sysctl.conf
    或者
    $ sudo  vi /usr/lib/sysctl.d/00-system.conf
    # 添加如下代码:
    net.ipv4.ip_forward=1
    
    重启network服务
    $ sudo systemctl restart network
    
    查看是否修改成功
    $ sudo sysctl net.ipv4.ip_forward
    
    #如果返回为“net.ipv4.ip_forward = 1”则表示成功了
    

    安装

    由于ubuntu维护的docker版本比较老,所以建议使用docker自己维护的版本

    法一:

    较为麻烦

    apt-get update
    apt-get install-y apt-transport-https
    echo deb https://get.docker.com/ubuntu docker main>/etc/apt/
    sources.list.d/docker.list
    # 添加仓库的key
    $apt-key adv--keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 36A1D7869245C8950F966E92D8576A8BA88D21E9
    #安装
    $ apt-get update
    $ apt-get install -y lxc-docker
    

    法二:

    docker简易安装方法->脚本

    # 如果没有安装curl,先安装curl
    $ sudo apt-get install -y curl
    # 淘汰!
    $ curl -sSL https://get.docker.com/ubuntu/ | sudo sh
    # 推荐用wget
    $ wget -qO- https://get.docker.com/ | sh
    

    相关文章

      网友评论

        本文标题:Docker使用学习

        本文链接:https://www.haomeiwen.com/subject/mthrxhtx.html