docker

文章目录

    • 一、Docker简介
      • Docker和传统的虚拟化比较
      • Docker核心概念
    • 二、安装Docker
    • 三、镜像管理
    • 四、Docker通过容器创建镜像
    • 五、通过模板创建镜像
    • 六、容器管理
    • 七、仓库管理
      • 步骤
    • 八、数据管理
      • 步骤
    • 九、数据卷备份恢复
      • 恢复
    • 十、Docker网络模式/opration not permitted问题
      • 外部访问容器
      • 步骤
      • 问题 dbus-daemon没有启动
      • 测试
    • 十一、配置桥接网络
      • 步骤
    • 十二、Dockerfile格式
      • dockerfile命令
      • FROM
      • MAINTAINER
      • RUN
      • CMD
      • ENTRYPOINT
      • EXPOSE
      • ENV
      • ADD
      • COPY
      • VOLUME
      • USER
      • WORKDIR
    • 十三、Dockerfile示例(安装nginx)
    • 十四、docker compose部署服务
      • 步骤
      • 实战

一、Docker简介

Docker是一种容器技术,它可以快速部署环境。
其官网

https://github.com/docker/docker.github.io

Docker是开源的容器引擎,可以让开发者打包应用以及依赖的库,然后发布到任何流行的linux发行版上,移植很方便。

它由go语言编写,基于apache2.0协议发布。基于linux kernel,要想在win下运行需要借助一个vm(虚拟机)来实现

自2013年开始,近些年发展迅猛,docker从1.13x开始,版本分为社区版ce和企业版ee,并且基于年月的时间线形式,当前最新稳定版为17.09 参考

http://blog.csdn.net/chenhaifeng2016/article/details/68062414

Docker和传统的虚拟化比较

docker_第1张图片

传统虚拟化和docker都是建立在有硬件支持的物理机上的操作系统上。传统虚拟化在操作系统上建立Hypervisor来驱动虚拟化。docker 上的docker engine 也Hypervisor类似,也是用来驱动虚拟化的。不同的是docker是不需要安装客户虚拟机来安装应用或者服务

  • Docker的优势
    • 启动非常快,秒级实现
    • 资源利用率高,一台高配置服务器可以跑上千个docker容器
    • 更快的交付和部署,一次创建和配置后,可以在任意地方运行
    • 内核级别的虚拟化,不需要额外的hypevisor支持,会有更高的性能和效率
    • 易迁移,平台依赖性不强

docker_第2张图片

Docker核心概念

镜像,是一个只读的模板,类似于安装系统用到的那个iso文件,我们通过镜像来完成各种应用的部署。
容器,镜像类似于操作系统,而容器类似于虚拟机本身。它可以被启动、开始、停止、删除等操作,每个容器都是相互隔离的。
仓库,存放镜像的一个场所,仓库分为公开仓库和私有仓库。 最大的公开仓库是Docker hub hub.docker.com 国内公开仓库 dockerpool.com

二、安装Docker

安装docker有两种方法

  1. 下载官方最新的源并下载最新的包
[root@zyj-01 ~]# curl https://download.docker.com/linux/centos/docker-ce.repo -o  /etc/yum.repos.d/docker.repo

[root@zyj-01 ~]# yum install -y docker-ce
  1. 下载rpm包上传到机器上
    https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm
[root@zyj-01 src]# yum install -y container-selinux
[root@kun01 src]# rpm -ivh docker-ce-17.09.0.ce-1.el7.centos.x86_64.rpm

启动docker服务

[root@zyj-01 src]# systemctl start docker

三、镜像管理

下载镜像

格式:docker pull 镜像名

[root@zyj-01 src]# docker pull centos

由于下载国外的镜像慢 这里可以使用国内的加速器 重启服务再下载

[root@zyj-01 ~]# vim /etc/docker/daemon.json

{
  "registry-mirrors": ["https://dhq9bx4f.mirror.aliyuncs.com"]
}
[root@zyj-01 ~]# systemctl restart docker
[root@zyj-01 ~]# docker pull centos

查看本地的所有镜像

格式:docker images

[root@zyj-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        6 weeks ago         200MB

搜索指定的镜像

格式:docker search 镜像名

[root@zyj-01 ~]# docker search jumpserver

给镜像改名字 原来的镜像还在

格式:docker tag 镜像名 新镜像名[:备注]

[root@zyj-01 ~]# docker tag centos kun_centos

[root@zyj-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        6 weeks ago         200MB
kun_centos          latest              5182e96772bf        6 weeks ago         200MB

centos和 kun_centos名字不一样 但是 IMAGE ID 是一致的,它们是同一个镜像

也可以添加备注标签

[root@zyj-01 ~]# docker tag centos kun_centos:180918

[root@zyj-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              5182e96772bf        6 weeks ago         200MB
kun_centos          180918              5182e96772bf        6 weeks ago         200MB
kun_centos          latest              5182e96772bf        6 weeks ago         200MB

:180918指TAG的备注信息

把镜像启动为容器

格式:docker run -itd 镜像名

[root@zyj-01 ~]# docker run -itd centos
cdc6436e64ff3773c48d02f9847473326a3001a526db9808aecdfdff7e7dd9da

-i表示让容器的标准输入打开
-t表示分配一个伪终端
-d表示后台启动,要把-i -t -d 放到镜像名字前面

查看运行的容器

格式:docker ps

[root@zyj-01 ~]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS              PORTS               NAMES
cdc6436e64ff        centos              "/bin/bash"         About a minute ago   Up About a minute

查看全部容器 包括停止的容器

格式:docker ps -a

[root@zyj-01 ~]# docker ps -a

删除指定镜像

格式:docker rmi 镜像名[:备注]/ID

[root@zyj-01 ~]# docker rmi kun_centos
Untagged: kun_centos:latest

[root@zyj-01 ~]# docker rmi kun_centos:180918
Untagged: kun_centos:180918

当镜像有备注时,删除镜像也要带上备注,否则默认删除带latest的镜像,也可以指定image id 来删除镜像来把其他改名的镜像一同删除

[root@zyj-01 ~]# docker rmi 5182e96772bf

四、Docker通过容器创建镜像

可以通过容器来自定义镜像 来创建自己的镜像

进入启动的容器里

格式:docker exec -it 容器ip bash

[root@zyj-01 ~]# docker exec -it cdc643 bash

容器id可以用docker ps查看,最后面的bash为进入容器后我们要执行的命令,这样就可以打开一个终端。
进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像。这里我们安装net-tools工具 并按Ctrl+D退出容器

[root@cdc6436e64ff /]# yum install -y net-tools

容器创建新镜像

格式:docker commit -m "备注信息" [-a "作者名字"] image IP 新镜像名字

[root@zyj-01 ~]# docker commit -m "install net-tools" -a "kun" cdc6436e centos_net

-m 加一些改动信息
-a 指定作者相关信息 ,可以不加
cdc6436e这一串为容器id,再后面为新镜像的名字

[root@zyj-01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos_net          latest              aa79b8e09df5        4 minutes ago       293MB
centos              latest              5182e96772bf        6 weeks ago         200MB

已经多了一个centos_net得镜像

五、通过模板创建镜像

先通过下面网址去下载模板文件,再上传到服务器里http://openvz.org/Download/templates/precreated

把模板导入为镜像

格式:cat 模板镜像文件 | docker import - 镜像名

[root@zyj-01 src]# cat centos-6-x86-minimal.tar.gz | docker import - centos6

模板镜像文件一般为压缩包文件

[root@zyj-01 src]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos6             latest              6566ecb04304        About a minute ago   512MB
`

可以发现多了一个centos6的镜像

把镜像导出为文件

格式:docker save -o 导出的文件名 镜像名

[root@zyj-01 src]# docker save -o centos_net.tar centos_net  ##把镜像centos_net导出为centos_net.tar文件
导出的文件一般用于备份

通过文件来恢复镜像

格式:docker load < 文件名 或者 docker load --input 文件名

[root@zyj-01 src]# docker load < centos_net.tar 

[root@zyj-01 src]# docker load --input centos_net.tar

把本地镜像上传到官网

格式:docker push 镜像名

[root@zyj-01 src]# docker push centos_net ## 前提是需要先注册一个用户

六、容器管理

通过镜像创建容器

格式:docker create -it 镜像名 bash

[root@zyj-01 src]# docker create -it centos_net bash

[root@zyj-01 src]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
3fe3d103b8b0        centos_net          "bash"              2 minutes ago       Created

可以发现centos_net启动为容器,当容器并没有启动

启动/关闭/重启容器

格式:docker start/stop/restart 容器id

[root@zyj-01 src]# docker start 3fe3d10

创建并启动容器

格式:docker run -it 镜像名 bash

[root@zyj-01 src]# docker run -it centos bash  
[root@55880ea82e93 /]#    ##自动进入容器里面来

这样进入了一个虚拟终端里面,我们可以运行一些命令,使用命令exit或者ctrl d 退出该bash,当退出后这个容器也会停止 -d 后台运行而不进入容器

自定义容器名字

格式:docker run -itd --name 自定义容器名 镜像名 bash

[root@zyj-01 src]# docker run -itd --name centos6_1 centos6 bash
容器名字是centos6_1
[root@zyj-01 src]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
7f07c79b1233        centos6             "bash"              57 seconds ago      Up 57 seconds                           centos6_1

NAMES就是表示自定义容器的名字,启动容器直接认输自定义容器的名字也可以启动

[root@zyj-01 src]# docker exec -it centos6_1 bash  ##进入centos6_1容器里
[root@7f07c79b1233 /]#

获取到容器的运行历史信息

格式:docker logs 容器id

[root@zyj-01 src]# docker run -itd  centos6 bash -c "echo 123"  ##创建启动容器并执行命令

[root@zyj-01 src]# docker logs 037b63ca6  
123

进入启动的容器里面

格式:docker exec -it 容器id bash 或者 docker attach 容器id

区别:docker attach 退出终端,容器也会退出。docker exec 退出终端,容器还在运行

[root@zyj-01 src]# docker exec -it centos6_1 bash

[root@zyj-01 src]# docker attach centos6_1 ##不需要家-it bash

删除容器

格式:docker rm [-f] 容器id

[root@zyj-01 src]# docker rm cdc6436e6

-f 把正在运行的容器删除掉

[root@zyj-01 src]# docker rm -f 7f07c7
7f07c7

把容器导出为文件

格式:docker export 容器id > 文件名

[root@zyj-01 src]# docker export centos6_1 > file.tar

一般把容器导出为文件用于迁移到其他机器上,再到另台机器上把文件导入镜像

[root@zyj-01 src]# cat file.tar | docker import - centos6_1

七、仓库管理

通过registry镜像来创建私有仓库,那么自定义的镜像就可以不需要上传到官网的公共仓库上了

步骤

  1. 下载registry镜像
[root@zyj-01 src]# docker pull registry
  1. 启动registry镜像为容器
[root@zyj-01 src]# docker run -d -p 5000:5000 registry
-p`会把容器的端口映射到宿主机上,`:左边为宿主机监听端口``:右边为容器监听端口
  1. 让上传的镜像打上固定格式标签
[root@zyj-01 src]# docker tag centos6 192.168.157.132:5000/centos6

标签名固定格式 IP地址:端口/标签名 用于上传私有仓库

  1. 把标记的镜像给推送到私有仓库

格式:docker push ip地址:端口/镜像名

[root@zyj-01 src]# docker push 192.168.157.132:5000/centos6
The push refers to a repository [192.168.157.132:5000/centos6]
Get https://192.168.157.132:5000/v2/: http: server gave HTTP response to HTTPS client

由于默认是使用https://形式上传文件 因此出错

  1. 修改配置文件
[root@zyj-01 src]# vim /etc/docker/daemon.json

添加下面参数

{ "insecure-registries":["192.168.157.132:5000"] }

配置文件里面指定添加此参数,需要把之前的加速器地址注释掉

  1. 重启docker服务和启动registry容器并再次上传
[root@zyj-01 src]# systemctl restart docker
[root@zyj-01 src]# docker ps -a
[root@zyj-01 src]# docker start 4d93e496  ##启动registry
[root@zyj-01 src]# docker push 192.168.157.132:5000/centos6

小提示: docker重启时所有的容器都自动启动
systemctl restart docker && docker start $(docker ps -a -q)

查看私有仓库

格式:curl IP地址:端口/v2/_catalog

[root@zyj-01 src]# curl 192.168.157.132:5000/v2/_catalog
{"repositories":["centos6"]}            ##私有库存里面有centos6镜像

下载私有库存中镜像

格式:docker pull ip地址:端口/镜像名

[root@zyj-01 src]# docker push 192.168.157.132:5000/centos6

前提客户机上安装docker和registry镜像和配置了daemon.json

八、数据管理

我们需要多个容器之间相互共享数据,类似于linux里面的NFS,所以就可以搭建一个专门的数据卷容器,相当于把容器中的目录给共享除了,然后其他容器直接挂载该数据卷。

步骤

  1. 建立数据卷容器

格式:docker run -itd -v 容器的目录 --name 容器别名 镜像名 bash

[root@zyj-01 tmp]# docker run -itd -v /data/ --name testvol centos6_1 bash

-v 后面指定共享容器目录 --name 指定容器的别名

centos6_1镜像启动为容器,名字叫testvol

[root@zyj-01 tmp]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
6ebb513ead13        centos6_1           "bash"              2 minutes ago       Up 2 minutes                            testvol
  1. 其他容器挂载该数据卷容器

格式:docker run -itd --volumes-from 容器别名 镜像名 bash

[root@zyj-01 tmp]# docker run -itd --volumes-from testvol centos6 bash

当容器关闭删除时产生的数据会丢失掉,因此可以把本地目录挂载到容器里来保持数据,此时此容器也称数据卷容器,其他容器可以挂载它来同步数据并保持到本地目录中

  1. 挂载本地的目录到容器里

格式:docker run -itd -v 本地目录:容器的目录 镜像名 bash

[root@zyj-01 ~]# docker run -itd -v /tmp/:/tmp centos6_1 bash

-v 用来指定挂载目录,:前面的/data/为宿主机本地目录:后面的/data/为容器里的目录,会在容器中自动创建

  1. 其他容器挂载该数据卷容器

由于没有定义–name 因此容器别名由系统随机定义 可以发现为boring_shockley

[root@zyj-01 tmp]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
ce916b75047d        centos6_1           "bash"              2 hours ago         Up 2 hours                              boring_shockley

[root@zyj-01 tmp]# docker run -itd --volumes-from boring_shockley  centos6 bash

进入刚刚运行的容器创建目录

[root@zyj-01 tmp]# docker exec -it 82e96c2ed9 bash
[root@82e96c2ed990 /]# cd /tmp/  ##进入tmp目录再创建aaa目录
[root@82e96c2ed990 tmp]# mkdir aaa

回到本地tmp目录下发现有刚刚创建的目录

[root@zyj-01 tmp]# ls
aaa

九、数据卷备份恢复

开始建立数据卷容器时候并没有映射宿主机的目录,用已下方法备份

[root@zyj-01 ~]# docker run -itd -v /data/ --name testvol1 centos6_1 bash

宿主机创建备份目录

[root@zyj-01 ~]# mkdir -p /data/backup

新开容器挂载数据卷容器并映射本地备份目录和执行压缩命令

[root@zyj-01 ~]# docker run --volumes-from testvol1 -v /data/backup/:/backup centos6_1 tar cvf /backup/data.tar /data/

--volumes-from testvol1 指定挂载数据卷testvol1
-v /data/backup/:/backup 容器中/backup映射到本地机/data/backup/
tar cvf /backup/data.tar /data/ 把容器中的/data目录拷贝到容器中的/backup/中,也就是本地机的/data/backup/

思路图

docker_第3张图片

恢复

思路: 和备份思路一样,先新建一个数据卷容器,再建一个新的容器并挂载该数据卷容器,然后再把tar包解包。

新建数据卷容器

[root@zyj-01 ~]#docker run -itd -v /data/ --name testvol2 centos bash

挂载数据卷新建容器,并解包

[root@zyj-01 ~]#docker run --volumes-from testvol2  -v /data/backup/:/backup centos tar xf /backup/data.tar

十、Docker网络模式/opration not permitted问题

  • Docker中有4种网络模式
    • host模式:docker使用的网络实际上和宿主机一样,在容器内看到的网卡ip是宿主机ip。使用docker run时使用--net=host指定
    • container模式:多个容器使用共同的网络,看到的ip是一样的。使用--net=container:container_id/container_name
    • none模式:这种模式下,不会配置任何网络。使用--net=none指定
    • bridge模式:这种模式会为每个容器分配一个独立的Network Namespace。类似于vmware的nat网络模式。同一个宿主机上的所有容器会在同一个网段下,相互之间是可以通信的。使用--net=bridge指定默认模式,不用指定默认就是这种网络模式。

外部访问容器

思路:
首先使用centos镜像新建一个容器,然后在该容器中安装httpd服务,并启动。
再把该容器导成一个新的镜像(centos-nginx),然后再使用新镜像创建容器,并指定端口映射。
再通过其他机器来访问本地的映射端口来访问容器

步骤

1.创建容器并安装软件,这里已nginx为实例

[root@zyj-01 ~]# docker run -itd centos_net bash  ##启动容器
[root@zyj-01 ~]# docker exec -it 9eeb7d5e669 bash  ##进入容器
[root@9eeb7d5e6697 /]# yum install -y epel-release
[root@9eeb7d5e6697 /]# yum install -y nginx  ##安装nginx
[root@9eeb7d5e6697 /]# systemctl start nginx

2.把安装了Nginx的容器转换为镜像

[root@zyj-01 ~]# docker commit -m "install nginx" -a "kun" 9eeb7d5 centos_nginx

3.把镜像启动为容器并映射宿主机的端口

[root@zyj-01 ~]# docker run -itd -p 8888:80 centos_nginx bash
-p` 指定端口映射 `:左边是宿主机端口``:右边是容器端口

4.进入容器启动服务

[root@zyj-01 ~]# docker exec -it 316962b bash ##进入新的容器
[root@316962b00ea1 /]# systemctl start nginx
Failed to get D-Bus connection: Operation not permitted

问题 dbus-daemon没有启动

Failed to get D-Bus connection: Operation not permitted

解决 启动容器是添加启动dbus-daemon参数

[root@316962b00ea1 /]# exit
[root@zyj-01 ~]# docker rm -f 316962b00  ##退出并删除正在运行的容器再带上参数运行
[root@zyj-01 ~]# docker run -itd --privileged -e "container=docker" -p 8888:80 centos_nginx /usr/sbin/init 
[root@zyj-01 ~]# docker exec -it b810dc9653 bash  ##进入添加参数后的容器
[root@b810dc96534f /]# systemctl start nginx

测试

使用浏览器访问宿主机的8888端口

十一、配置桥接网络

为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求。只要将Docker容器和宿主机的网卡桥接起来,再给Docker容器配上IP就可以了。

步骤

1.把宿主机的网卡拷贝一份为br0网卡

[root@zyj-01 ~]# cd /etc/sysconfig/network-scripts/
[root@zyj-01 network-scripts]# cp ifcfg-ens33 ifcfg-br0

2.修改ens33和br0网卡配置

[root@zyj-01 network-scripts]# vim ifcfg-ens33

ens33增加BRIDGE=br0,删除IPADDR,NETMASK,GATEWAY,DNS1,UUID

#UUID=853ab223-b6fa-419a-8fbe-f1476d83f2ca
#IPADDR=192.168.157.132
#NETMASK=255.255.255.0
#GATEWAY=192.168.157.2
#DNS1=119.29.29.29
BRIDGE=br0
[root@zyj-01 network-scripts]# vim ifcfg-br0

br0修改TYPE为Bridge DEVICE改为br0 NAME改为br0

TYPE=Bridge
DEVICE=br0
NAME=br0

3.重启网络

[root@zyj-01 network-scripts]# systemctl restart network

br0有IP地址 ens33没有IP地址为正确配置

[root@zyj-01 network-scripts]# ifconfig
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.157.132  netmask 255.255.255.0  broadcast 192.168.157.255
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:71:e0:91  txqueuelen 1000  (Ethernet)

4.下载pipework

[root@zyj-01 network-scripts]# cd
[root@zyj-01 ~]# git clone https://github.com/jpetazzo/pipework

5.把pipework拷贝到环境变量中

[root@zyj-01 ~]# git clone https://github.com/jpetazzo/pipework.git
[root@zyj-01 ~]# cd pipework/
[root@zyj-01 pipework]# cp pipework /usr/local/bin/

6.运行一个不配置任何网络的容器

[root@zyj-01 pipework]# docker run -itd --net=none centos_net bash

7.为刚刚容器重新设置新网段

[root@zyj-01 pipework]# pipework br0 019a92112 192.168.157.66/[email protected]
@前表示要设置的新IP和宿主机的IP同网段` `@后表示网关

8.进入容器里面看看网络

[root@zyj-01 pipework]# docker exec -it 019a92112 bash
[root@019a92112feb /]# ifconfig
eth1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.157.66  netmask 255.255.255.0  broadcast 192.168.157.255

看到刚刚的IP地址出现证明设置正确

十二、Dockerfile格式

使用dockerfile可以快速创建镜像

dockerfile命令

FROM

指定基于哪个基础镜像
格式: FROM 或者 FROM :

FROM centos
FROM centos:latest

MAINTAINER

指定作者信息

格式:MAINTAIN

MAINTAINER  aming  [email protected]

RUN

镜像操作指令
格式: RUN 或者 RUN ["executable","param1","param2"]

RUN  yum install  httpd
RUN ["/bin/bash", "-c", "echo hello"]

CMD

RUN和CMD看起来挺像,但是CMD用来指定容器启动时用到的命令,只能有一条。
三种格式:CMD ["executable", "param1", "param2"] 或者 CMD command param1 param2 或者 CMD ["param1", "param2"]

CMD ["/bin/bash", "/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

ENTRYPOINT

容器启动时要执行的命令,它和CMD很像,也是只有一条生效,如果写多个只有最后一条有效。和CMD不同是:CMD 是可以被 docker run 指令覆盖的,而ENTRYPOINT不能覆盖。
格式:ENTRYPOINT ["executable", "param1", "param2"] 或者 ENTRYPOINT command param1 param2 或者 ENTRYPOINT ["param1", "param2"]

容器名字为aming,我们在Dockerfile中指定如下CMD:CMD ["/bin/echo", "test"]
启动容器的命令是 docker run aming 这样会输出 test
假如启动容器的命令是 docker run -it aming /bin/bash 什么都不会输出
ENTRYPOINT不会被覆盖,而且会比CMD或者docker run指定的命令要靠前执行
ENTRYPOINT ["echo", "test"]
docker run -it aming 123
则会输出 test 123 ,这相当于要执行命令 echo test 123

EXPOSE

用来指定要映射出去的端口
格式:EXPOSE [...]

EXPOSE 22 80 8443

容器内部我们启动了sshd和nginx,所以我们需要把22和80端口暴漏出去。这个需要配合-P(大写)来工作,也就是说在启动容器时,需要加上-P,让它自动分配。如果想指定具体的端口,也可以使用-p(小写)来指定。

ENV

为后续的RUN指令提供一个环境变量,我们也可以定义一些自定义的变量
格式:ENV

ENV PATH /usr/local/mysql/bin:$PATH
ENV MYSQL_version 5.6

ADD

将本地的一个文件或目录拷贝到容器的某个目录里。 其中src为Dockerfile所在目录的相对路径,它也可以是一个url。
格式:ADD

ADD <conf/vhosts> </usr/local/nginx/conf>

COPY

使用方法和add一样,不同的是,它不支持url
格式:COPY

COPY 1.txt /tmp/2.txt

VOLUME

创建一个可以从本地主机或其他容器挂载的挂载点。
格式: VOLUME ["/data"]

USER

指定运行容器的用户
格式: USER daemon

WORKDIR

为后续的RUN、CMD或者ENTRYPOINT指定工作目录
格式:WORKDIR /path/to/workdir

十三、Dockerfile示例(安装nginx)

1.创建Dockerfile文件

[root@zyj-01 ~]# vim Dockerfile

添加下面代码

## Set the base image to CentOS 下载本地镜像
FROM centos
# File Author / Maintainer 作者
MAINTAINER kun@180923
# Install necessary tools 下载其他安装包
RUN yum install -y pcre-devel wget net-tools gcc zlib zlib-devel make openssl-devel
# Install Nginx
ADD http://nginx.org/download/nginx-1.8.0.tar.gz .
RUN tar zxvf nginx-1.8.0.tar.gz
RUN mkdir -p /usr/local/nginx
RUN cd nginx-1.8.0 && ./configure --prefix=/usr/local/nginx && make && make install
RUN rm -fv /usr/local/nginx/conf/nginx.conf
ADD http://www.apelearn.com/study_v2/.nginx_conf /usr/local/nginx/conf/nginx.conf
# Expose ports 暴露80端口
EXPOSE 80
# Set the default command to execute when creating a new container 启动服务 tail -f /etc/passwd 为了让容器不中断
ENTRYPOINT /usr/local/nginx/sbin/nginx && tail -f /etc/passwd

2.创建镜像

[root@zyj-01 ~]# docker build -t centos_nginx .

-t 指定创建镜像的名字

[root@zyj-01 ~]# docker images
REPOSITORY                    TAG                 IMAGE ID            CREATED             SIZE
centos_nginx                  latest              5868685fbec2        31 seconds ago      364MB

centos_nginx是我们用dockerfile创建的镜像

3.启动镜像为容器

[root@zyj-01 ~]# docker run -itd -p 8888:80 centos_nginx bash

可以正常访问Nginx服务

[root@zyj-01 ~]# curl 127.0.0.1:8888 -I
HTTP/1.1 200 OK

十四、docker compose部署服务

docker compose可以方便我们快捷高效地管理容器的启动、停止、重启等操作,它类似于linux下的shell脚本,基于yaml语法。
在该文件里我们可以描述应用的架构,比如用什么镜像、数据卷、网络模式、监听端口等信息。我们可以在一个compose文件中定义一个多容器的应用(比如jumpserver),然后通过该compose来启动这个应用。

步骤

1.下载compose

[root@zyj-01 ~]# curl -L https://github.com/docker/compose/releases/download/1.17.0-rc1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

2.设置权限

[root@zyj-01 ~]# chmod 755 /usr/local/bin/docker-compose

查看compose版本

格式:docker-compose version

[root@zyj-01 ~]# docker-compose version
docker-compose version 1.17.0-rc1, build a0f95af
docker-py version: 2.5.1
CPython version: 2.7.13
OpenSSL version: OpenSSL 1.0.1t  3 May 2016

实战

编写一个docker-compose 代码在下面网址
https://coding.net/u/aminglinux/p/yuanke_centos7/git/blob/master/25docker/docker-compose.yml

[root@zyj-01 ~]# vim docker-compose.yml

version: "2"
services:
  app1:
    image: centos_nginx
    ports:
      - "8080:80"
    networks:
      - "net1"
    volumes:
      - /data/:/data
  app2:
    image: centos_net
    networks:
      - "net2"
    volumes:
      - /data/:/data1
    entrypoint: tail -f /etc/passwd
networks:
  net1:
    driver: bridge
  net2:
    driver: bridge

entrypoint: tail -f /etc/passwd 作用和dockerfile中一样 为了让最后一个容器继续开启 bridge 类似vmwaver中NAT模式 默认的

启动容器

[root@zyj-01 ~]# docker-compose up -d

up 表示创建并启动容器 -d 表示后台运行

查看文档

[root@zyj-01 ~]# docker-compose --hlep

docker-compose ps 查看所有容器情况
docker-compose stop 停止运行容器 和start对应
docker-compose down 停止并移除容器 和up对立
docker-compose rm 删除停止的容器 -f 删除正在运行的容器

你可能感兴趣的:(笔记)