Docker

Posted HOUHUILIN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Docker相关的知识,希望对你有一定的参考价值。

1、docker search 查找ngix

2、docker pull下载镜像

3、查看镜像列表

4、docker run启动容器

5、测试nginx容器是否启动成功

 

 

 

1、docker search 查找ngix

[root@node01 ~]# docker search nginx
NAME                                              DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
nginx                                             Official build of Nginx.                        18563     [OK]
unit                                              Official build of NGINX Unit: Universal Web …   4         [OK]
nginxproxy/nginx-proxy                            Automated Nginx reverse proxy for docker con…   87
nginxproxy/acme-companion                         Automated ACME SSL certificate generation fo…   113
bitnami/nginx                                     Bitnami nginx Docker Image                      164                  [OK]
bitnami/nginx-ingress-controller                  Bitnami Docker Image for NGINX Ingress Contr…   29                   [OK]
ubuntu/nginx                                      Nginx, a high-performance reverse proxy & we…   95
nginxproxy/docker-gen                             Generate files from docker container meta-da…   12
kasmweb/nginx                                     An Nginx image based off nginx:alpine and in…   6
rancher/nginx-ingress-controller                                                                  11
rancher/nginx-ingress-controller-defaultbackend                                                   2
bitnami/nginx-exporter                                                                            3
rancher/nginx                                                                                     2
rapidfort/nginx-ib                                RapidFort optimized, hardened image for NGIN…   10
rapidfort/nginx                                   RapidFort optimized, hardened image for NGINX   14
vmware/nginx-photon                                                                               1
bitnami/nginx-ldap-auth-daemon                                                                    3
rapidfort/nginx-official                          RapidFort optimized, hardened image for NGIN…   10
vmware/nginx                                                                                      2
rancher/nginx-conf                                                                                0
linuxserver/nginx                                 An Nginx container, brought to you by LinuxS…   201
nginxproxy/forego                                 Foreman in Go                                   0
privatebin/nginx-fpm-alpine                       PrivateBin running on an Nginx, php-fpm & Al…   72                   [OK]
bitnami/nginx-intel                                                                               1
bitnamicharts/nginx                                                                               0
[root@node01 ~]#

 

2、docker pull下载镜像

[root@node01 ~]# docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
f03b40093957: Pull complete
eed12bbd6494: Pull complete
fa7eb8c8eee8: Pull complete
7ff3b2b12318: Pull complete
0f67c7de5f2c: Pull complete
831f51541d38: Pull complete
Digest: sha256:af296b188c7b7df99ba960ca614439c99cb7cf252ed7bbc23e90cfda59092305
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
[root@node01 ~]#

 

3、docker images查看镜像列表

[root@node01 ~]# docker images
REPOSITORY    TAG       IMAGE ID       CREATED         SIZE
nginx         latest    f9c14fe76d50   3 days ago      143MB
hello-world   latest    9c7a54a9a43c   3 weeks ago     13.3kB
mysql         latest    8189e588b0e8   5 weeks ago     564MB
centos        latest    5d0da3dc9764   20 months ago   231MB
[root@node01 ~]#
[root@node01 ~]#

 

4、docker run启动容器

[root@node01 ~]# docker run -d --name nginx01 -p 3344:80 nginx
a8c7e5cdd790f5febe9dfa7648b29e8a145c9e5314fca723cb186343bf8d605f
[root@node01 ~]#
[root@node01 ~]#
[root@node01 ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                                   NAMES
a8c7e5cdd790   nginx     "/docker-entrypoint.…"   2 seconds ago    Up 2 seconds    0.0.0.0:3344->80/tcp, :::3344->80/tcp   nginx01
740ee6cbc783   centos    "bash"                   12 minutes ago   Up 12 minutes                                           reverent_bardeen
[root@node01 ~]#
[root@node01 ~]#

 

5、测试nginx容器是否启动成功

[root@node01 ~]# curl localhost:3344
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html  color-scheme: light dark; 
body  width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; 
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>
[root@node01 ~]#

 

Docker基础

目录

Docker基础

一 docker 容器介绍

1.1 docker的理念

一次构建,多处运行、
拒绝ssh,日抛型的隐形眼镜

1.2 docker的组成

CS架构

组成与组件
docker由docker server和docker client组成
docker组件包括镜像、容器、仓库

docker对比kvm

类别 Docker KVM/OpenStack
部署难度 非常简单 组件多,部署复杂
启动速度 秒级 分钟级
执行性能 与物理系统几乎一致 VM会占用一些资源
镜像体积 镜像是MB级别 虚拟机镜像是GB级别
管理效率 管理简单 组件相互依赖,管理复杂
隔离性 隔离性高 彻底隔离
可管理性 单进程,不建议启动SSH 完成的系统管理
网络连接 比较弱 建筑Neutron可以了灵活组建各类网络架构

1.3 docker 能干什么

简化配置
流水线管理
提高开发效率
应用隔离
整合服务器资源
debug
多租户能力??
快速部署

1.4 docker改变了什么

产品交付:直接交付镜像 dockerfile
面向开发:简化环境配置
面向测试:多版本测试 -- 较少提测排队时间
面向运维:环境一致性
面向架构:自动化扩容(微服务)

1.5 基于docker的不可变基础设施

故障来源于变更
用替换的方式来做变更、回滚
一旦上线 上线的内容不可变

二 Docker镜像和容器管理

2.1 相关站点

Docker官网
Docker官方文档
阿里云镜像站
Docker HUB

2.2 Docker部署与实践

系统环境:

cat /etc/redhat-release
CentOS Linux release 7.4.1708 (Core)

2.2.1 安装docker-ce源

cd /etc/yum.repos.d/
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

2.2.2 安装docker-ce

yum install docker-ce -y

2.2.3 启动docker

systemctl enable docker.service
systemctl start docker.service
# 无法启动 删除/var/lib/docker  重新下载

2.2.4 常用命令

docker search centos # 搜索镜像
docker pull centos
docker images
# 镜像导出 当前路径下
docker save -o centos.tar centos:latest
# 镜像导入
docker load < centos.tar # <==> docker --input centos.tar 
# 镜像删除
docker rmi images_name # <==>  docker rmi images_id

安装系统 并没有安装系统内核,只是lib库之类的。
所以即使在centos的宿主机上起了ubuntu的容器,但是设计到内核的一些特性,还是依赖于centos系统。反之亦然

启动容器 即是启动镜像
可以启动一个已经pull下来的镜像,也可以启动一个不存在的镜像

docker run centos /bin/echo ‘Hello world‘
docker ps -a # -a 看到所有的容器 包括已经exited的

docker run的时候 先检查本地是否有镜像 ,没有就先pull

docker在会在前台运行一个任务,任务结束,容器即停止。
如果我们用docker运行一个nginx,那我们需要保证这个nginx任务不能停止。

docker run --name mydocker -t -i centos /bin/bash   # -t tty 分配一个伪终端 -i 标准输入  
[[email protected] ~]# docker run --name mydocker -t -i centos /bin/bash
[[email protected] /]# ps -aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.6  0.0  11820  1908 pts/0    Ss   06:57   0:00 /bin/bash
root        14  0.0  0.0  51708  1700 pts/0    R+   06:58   0:00 ps -aux
[[email protected] /]# exit

此时执行docker ps -a会发现刚才起的容器已经退出。因为我们在这个docker运行的任务是/bin/bash。退出了bash,容器就自动停止了。

docker start mydocker
docekr stop mydocker
docker run .... -h hostname # 指定主机名

2.2.6 进入容器的三张方式

  1. attach
docker attach mydocker  # 缺点 多个窗口同步进入  会同步显示,一个命令阻塞,所有窗口无法操  退出即终止
退出方式:ctrl + P  再+q
  1. nsenter # namespace enter nsenter 进入容器 需要容器的pid
    生产中用到的比较多
# 需要安装  
yum install util-linux

获取docker详情

docker inspect mydocker 

只获取容器pid:(容器第一个进程的PID)

docker inspect --format "{{.State.Pid}}"  mydocker

nsenter进入容器

 nsenter  --target 19265 --mount --uts --ipc --net --pid
 # --mount 指定命名空间
 # 。。。

这时候执行exit 不会退出docker里面的bash, docker进程不会终止

进入脚本:

#!/bin/bash

# Use nsenter to access docker

docker_in(){
   NAME_ID=$1
   PID=$(docker inspect -f "{{ .State.Pid }}" $NAME_ID) 
   nsenter -t $PID -m -u -i -n -p
}

docker_in $1
  1. docker exec
    这个命令用来在 一个正在运行的容器中去执行命令
docker exec mydocker whoami   

可以巧妙的利用这个命令去进入容器

docker exec -it mydocker /bin/bash

docker exec 退出不影响进程。

三种方式总结
attach 使用的是容器本身的bash 所以exit退出 会停止容器
nsenter 和 docker exec是开启了一个新的bash

docker inspest docker_name # 容器详情 用法:可以使用-f指定参数
docker rm docker_name  # 删除正在运行的容器会报错 需要先stop 可强制删除 -f  生产禁止!
docker run --rm centos /bin/echo "hehe" # 退出自动删除容器 --rm 测试用

2.2.7 docker支持tcp连接管理

vim /usr/lib/systemd/system/docker.service
# 修改配置
# ExecStart=/usr/bin/dockerd
# ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 # 重启会发现本地docker命令找不到socket
ExecStart=/usr/bin/dockerd -H tcp://192.168.56.12 -H unix://var/run/docker.sock

systemctl daemon-reload
systemctl restart docker.service

查看端口 默认:2375

netstat  -lntup
#####
tcp        0      0 192.168.56.12:2375      0.0.0.0:*               LISTEN      29849/dockerd

我们可以在其他机器通过tcp管理这台机器上的docker

[[email protected] ~]# docker -H 192.168.56.12 info

2.2.8 docker其他命令

  attach      Attach local standard input, output, and error streams to a running container
  build       Build an image from a Dockerfile
  commit      Create a new image from a container‘s changes
  cp          Copy files/folders between a container and the local filesystem
  create      Create a new container
  diff        Inspect changes to files or directories on a container‘s filesystem
  events      Get real time events from the server
  exec        Run a command in a running container
  export      Export a container‘s filesystem as a tar archive
  history     Show the history of an image
  images      List images
  import      Import the contents from a tarball to create a filesystem image
  info        Display system-wide information
  inspect     Return low-level information on Docker objects
  kill        Kill one or more running containers
  load        Load an image from a tar archive or STDIN
  login       Log in to a Docker registry
  logout      Log out from a Docker registry
  logs        Fetch the logs of a container
  pause       Pause all processes within one or more containers
  port        List port mappings or a specific mapping for the container
  ps          List containers
  pull        Pull an image or a repository from a registry
  push        Push an image or a repository to a registry
  rename      Rename a container
  restart     Restart one or more containers
  rm          Remove one or more containers
  rmi         Remove one or more images
  run         Run a command in a new container
  save        Save one or more images to a tar archive (streamed to STDOUT by default)
  search      Search the Docker Hub for images
  start       Start one or more stopped containers
  stats       Display a live stream of container(s) resource usage statistics
  stop        Stop one or more running containers
  tag         Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
  top         Display the running processes of a container
  unpause     Unpause all processes within one or more containers
  update      Update configuration of one or more containers
  version     Show the Docker version information
  wait        Block until one or more containers stop, then print their exit codes

2.2.9 docker run 命令

--cpuset-cpus 0  # 绑定运行在0号CPU上
-c 2048         # 指定cpu权重 默认1024

dockr run --help

三 Docker的网络访问和数据管理

3.1 Docker网络

3.1.1 docker网络访问

运行一个docker nginx

 docker pull nginx
 docker images
 docker run -d -P nginx  # -d 后台 -P 随机端口映射
 docker ps  # 可以查看到一个随机端口,可以通过这个端口访问
 docker logs ‘docker_id(name)’ # 查看日志 nginx运行在前台
docker run -d -p 3333:80 --name nginx-demo nginx # -p 指定映射端口,宿主机多个ip时 可以指定地址映射 
# 可以只指定ip 不指定端口
# 默认协议tcp 可以 :udp 指定协议
docker port docker_name  # 查看一个容器的映射端口 
### 
-d, --detach       Run container in background and print container ID
如果在docker run后面追加-d=true或者-d,那么容器将会运行在后台模式。此时所有I/O数据只能通过网络资源或者共享卷组来进行交互。因为容器不再监听你执行docker run的这个终端命令行窗口。但你可以通过执行docker attach来重新附着到该容器的会话话中。需要注意的是,容器运行在后台模式下,是不能使用--rm选项的。

技术分享图片

3.2.2 docker内网互通

同宿主机上内网互通

1、link 单机容器互通常用(别名)

docker run -itd --name test1 192.168.56.11/app/jenkins
docker run -itd --link test1:t1 --name test2 192.168.56.11/app/jenkins
## link Add link to another container,可以在test2中通过主机名t1访问test1

2、docker network

# 默认有三种模式
[[email protected] ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
89f45a7a5f5d        bridge              bridge              local
26f0654bc9db        host                host                local
ed3b95232e9f        none                null                local

host模式

# hosts模式,网卡模式与宿主机模式一致
# 先启动一台nginx 映射80端口
docker run --rm -itd --name test1 -p 80:80  nginx
#再绑定host网卡启动,不映射端口,前台运行,会发现报端口占用。
docker run --rm -it --name test2  --net=host  nginx


# 优点:充分利用网卡的性能
# 缺点:容易对本地端口进行占用
# 只有对网络性能要求比较高的情况下才使用

bridge模式

docker rm -f $(docker ps -a -q)
# 创建一张自己的桥接网卡
docker network create --driver bridge gm0
docker network ls
# 查看网卡信息
[[email protected] ~]# ifconfig
br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:1eff:fe1f:b0e6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:1e:1f:b0:e6  txqueuelen 0  (Ethernet)
        RX packets 26  bytes 2340 (2.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26  bytes 2340 (2.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:cdff:fed3:42bd  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cd:d3:42:bd  txqueuelen 0  (Ethernet)
        RX packets 2644  bytes 112598 (109.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4596  bytes 6442280 (6.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 创建两台容器,查看IP
docker run --rm -itd -p 81:80  --name test1   nginx
# 172.17.0.2
docker run --rm -itd -p 82:80  --name test2   --network=gm0  nginx
# 172.18.0.2
## 生产环境指定网段
docker network create --driver bridge --gateway 192.168.10.1 --subnet 192.168.10.0/24 gm1

# --bridge  指定驱动
# --gateway 设定网关
# --subnet  设置子网

[[email protected] ~]# ifconfig
br-8aac39faf141: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255
        inet6 fe80::42:1eff:fe1f:b0e6  prefixlen 64  scopeid 0x20<link>
        ether 02:42:1e:1f:b0:e6  txqueuelen 0  (Ethernet)
        RX packets 26  bytes 2340 (2.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 26  bytes 2340 (2.2 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

br-bd9624c7d8ac: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        inet 192.168.10.1  netmask 255.255.255.0  broadcast 192.168.10.255
        ether 02:42:a7:91:11:ce  txqueuelen 0  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255
        inet6 fe80::42:cdff:fed3:42bd  prefixlen 64  scopeid 0x20<link>
        ether 02:42:cd:d3:42:bd  txqueuelen 0  (Ethernet)
        RX packets 2644  bytes 112598 (109.9 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4596  bytes 6442280 (6.1 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# 指定新网卡创建容器
docker run --rm -itd -p 83:80  --name test3   --network=gm1  nginx
# 192.168.10.2

# 指定新网卡创建容器,并指定ip
docker run --rm -itd -p 83:80  --name test3   --network=gm1 --ip=192.168.10.250 nginx
# 192.168.10.250

docker run --rm -it --ip 192.168.10.247  --name test11   --network=gm1  centos
docker run --rm -it --ip 192.168.10.248  --name test12   --network=gm1  centos
# 在两台容器中,互ping对方容器名称,可以直接ping通。
# 这个解析只对我们自定义的网络有效,可通过容器名进行解析。
# 1. 自建网络 2. 主机名不存在解析

不同docker网卡创建的容器如何互通(不同网段)

# 可以将一个容器绑定到另一个网卡上
# docker run --rm -it --ip 192.168.10.248  --name test12   --network=gm1  centos
docker network  connect gm0 test12
# 此时test12 可以ping通绑定gm0网卡的容器。 这时test12会有两个ip,分别和两个网段进行通信
跨主机之间的docker容器互通
  1. consul overlay全局网卡 。 。 。
  2. Flanneld + Etcd
    技术分享图片

3.2 Docker数据数据存储

3.2.1 数据卷

volumes

-v /data
# 挂载一个目录到容器的/data目录下。挂到哪儿?
docker run -d --rm --name nginx-test1 -v /data nginx
docker inspect nginx-test1 # 找到Mounts信息

可以发现,我们不指定挂载源,docker默认挂载到:/var/lib/docker/volumes/下,可以创建文件测试下

        "Mounts": [
            {
                "Type": "volume",
                "Name": "7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4",
                "Source": "/var/lib/docker/volumes/7171f9f4d0602af66d6aa0eb35733f09a35c84ac070480030c3aec469c4515a4/_data",
                "Destination": "/data",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

生产常用 指定源挂载

-v src:det 
docker run -d --name nginx-test2 -v /data/docker-volume-ngninx:/data nginx  # src 目录会自动创建 (touch文件测试)

3.2.2 数据卷容器

开发环境: 挂载代码目录 -v /src:/dst
生产环境:存储持久化数据

--volumes-from
一个特殊的容器

# 把宿主机的/data直接挂载到容器volume-demo的/data
# 这个容器就可以当做数据卷容器
docker run -d --name volume-demo -v /data:/data nginx

其他容器想使用相同的数据时,可以--volumes-from 直接指定这个数据卷容器。可以共享数据卷容器挂载的容器。

docker run -d --name nginx-volume-demo --volumes-from volume-demo nginx

数据卷容器特性:
数据卷容器stop状态,不影响挂载目录的使用

作用:
启动一个logstash或者filebeat的容器,把这个容器当做数据卷容器。做log的采集。即使这个容器挂掉,也不影响日志的存储。

用法:

所有服务日志都写在 /data/logs/下
数据卷容器filebeat启动: -v /data/logs:/data/logs 
其他容器启动 --volume-from filebeat

四 Docker镜像构建

4.1 Docker镜像手动构建

docker pull centos
docker run --name mynginx -it centos /bin/bash

## 安装epel源
rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
yum install nginx -y
# 需要把nginx放到前台运行,否则docker会挂掉。
#在nginx.conf中加入 
"daemon off;"

#退出容器
exit
docker commit -m ‘nginx on centos‘ ‘容器id‘ gm-nginx:v1
docker images # 可看到我们手动创建的镜像 gm-nginx:v1

测试镜像:

docker run -d -p 91:80 gm-nginx:v1 nginx # 最后的nginx是运行的命令
docker ps  # 看到容器启动成功,访问192.168.56.11:91测试 OK

4.2 Dockerfile自动构建Docker镜像

dockerfile基础指令
基础镜像信息
维护者信息
镜像操作指令
容器启动时执行指令
***

FROM:       指定基础镜像 谁是他妈
MAINTAINER: 指定维护者信息
RUN:        在要执行的命令前加上RUN
ADD:        copy文件,会自动解压 
WORKDIR:    设置当前工作目录(相当于cd)
VOLUME:     设置卷,挂载目录
EXPOSE:     设定打开的端口
CMD:        指定容器启动后要干的事情

dockerfile for nginx

 mkdir -p  /opt/dockerfile/gm-nginx
 cd /opt/dockerfile/gm-nginx
 vim Dockerfile

文件内容

# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum clean all # 让打包的镜像尽可能的小一点
RUN echo "daemon off;" >> /etc/nginx/nginx.conf  # 在生产中 我们直接add一个nginx.conf文件进去 不要更改文件
#ADD
# add 的文件要和Dockerfile在同一级目录下.
ADD index.html /usr/share/nginx/html/index.html
#WORKDIR
#VOLUME
#EXPOSE
EXPOSE 80
#CMD
CMD ["nginx"]
# 当前目录下执行:
echo "nginx in docker" > index.html
docker build -t gm-nginx:v2 . # -t 打tag  . (点)代表当前目录的Dockerfile
# 查看生成镜像
docker images
Dockerfile中CMD与ENTRYPOINT的区别

ENTRYPOINT,表示镜像在初始化时需要执行的命令,不可被重写覆盖,需谨记
CMD,表示镜像运行默认参数,可被重写覆盖
ENTRYPOINT/CMD都只能在文件中存在一次,并且最后一个生效 多个存在,只有最后一个生效,其它无效!
需要初始化运行多个命令,彼此之间可以使用 && 隔开,但最后一个须要为无限运行的命令,需切记!

4.3 镜像构建最佳实践

Dockerfile中层的概念

dockerfile中每一行的一个指令,都会生成一个层。每个Dockerfile中,都有From centos,centos镜像只下载一次,不会重复下载。一个存在的层,不会重复构建

分层构建

系统无内核,只是一个操作环境

4.3.1 系统层 构建Centos+SSH镜像

用惯了虚拟机,强依赖SSH服务的。。。。还是得装一个。

1. Docker镜像分层构建

docker镜像是分层存储的 构建也要分层构建
Dockerfile中的每一个指令,都会在镜像中有一个层

# 创建目录层级结构
cd /opt/dockerfile
mkdir -p system/centos runtime app
cd system/centos

vim Dockerfile
################## file start ##################

# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum install -y wget sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all

################## file  end ##################

# 构建镜像并查看
docker build -t system/centos:v1 .
docker images

mkdir system/centos-ssh && cd system/centos-ssh

vim Dockerfile
################## file start ##################

# Base Image
From centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum install -y nginx --enablerepo=epel
RUN yum install -y sudo git tree net-tools openssh-clients openssh-server openssh-devel && yum clean all
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key
RUN ssh-keygen -A -t  dsa -f /etc/ssh/ssh_host_dsa_key
# Set root password
RUN echo "root:123123" |chpasswd

################## file  end ##################
# 构建镜像并查看
docker build -t system/centos:v2 .
docker images
docker run -d --rm --name centos-ssh-demo -p 8022:22 system/centos:v2 /usr/sbin/sshd -D
ssh [email protected] -p 8022   # pass: 123123

4.3.2 Supervisor管理容器多进程

docker容器 只能在前台运行一个程序。如何搞定??

  • -d 后台运行
  • 脚本管理多个服务,保证脚本不退出。比如死循环
  • suoervisor管理 -- good

在刚才创建的容器中安装配置Supervisor

yum install -y supervisor
# 修改配置文件 /etc/supervisord.conf中 nodaemon=false 
# 让supervisor启动在前台
nodaemon=true    ; (start in foreground if true;default false)
### 

保存supervisord.conf到dockerfile同级目录
在当前目录准备文件sshd.ini(下面会用到)

# sshd.ini
[program:sshd]
command=/usr/sbin/sshd -D
process_name=%(program_name)s
autostart=true

构建Supervisor的镜像

 docker build -t system/centos . # 不打标签,最新版本 latest
 docker images
 docker run -d --name centos-ssh-supervisor -p 2222:22 system/centos
 ssh 192.168.56.11 -p 2222  # 密码 123123

4.3.3 环境层 构建JDK+Tomcat运行环境镜像

cd /opt/dockerfile/runtime/
mkdir tomcat && cd tomcat

vim Dockerfile
################## file start ##################

# Base Image
From system/centos
# MAINTAINER
MAINTAINER wph
#RUN
RUN yum install -y java-1.8.0-openjdk java-1.8.0-openjdk-devel && yum clean all
ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk

# For tomcat  Add 自动解压 COPY没有其他特性
ADD apache-tomcat-8.5.33.tar.gz /usr/local/
RUN ln -s /usr/local/apache-tomcat-8.5.33  /usr/local/tomcat

# For supervisor
ADD tomcat.ini /etc/supervisord.d/tomcat.ini
ENV TOMCAT_HOME /usr/local/tomcat
# Outside port
EXPOSE 22 8080
# CMD
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]


################## file  end ##################

当前目录准备tomcat安装包和tomat.ini文件

wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.33/bin/apache-tomcat-8.5.33.tar.gz

vim tomcat.ini
################## file start ##################
[program:tomcat]
command=/usr/local/tomcat/bin/catalina.sh run
process_name=%(program_name)s
autostart=true
################## file  end ##################

构建镜像测试

cd /opt/dockerfile/runtime/tomcat
docker build -t runtime/tomcat .
docker run -d --name tomcat-demo -p 8080:8080 -p 8888:22 runtime/tomcat

测试容器

ssh 127.0.0.1 -p8888  #pass 123123  
# 浏览器访问:http://192.168.56.11:8080
# success

4.3.4 应用层 构建jenkins应用镜像

系统+环境的镜像已经构建,应用只需要ADD包进去就OK
cd /opt/dockerfile/app/
mkdir jenkins && cd jenkins

vim Dockerfile
################## file start ##################
From runtime/tomcat
MAINTAINER wph
ADD jenkins.war  /usr/local/tomcat/webapps/
EXPOSE 22 8080
CMD ["/usr/bin/supervisord","-c","/etc/supervisord.conf"]
################## file  end ##################

准备jar包

wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war

构建测试

docker build -t app/jenkins .
docker run -d --name  jenkins-demo -p 98:22 -p 99:8080 app/jenkins

访问测试:

# 浏览器访问: http://192.168.56.11:99/jenkins
# success

构建升级
Dockerfile最佳实践
Docker最佳实践之多阶段构建


################## file start ##################
################## file  end ##################

五 构建Docker私有仓库

5.1 官方registry构建私有仓库

[[email protected] ~]# docker run -d --name docker-registry -p 5000:5000 registry
Unable to find image ‘registry:latest‘ locally
...

用官方提供的registry镜像启动,默认5000端口。
官方要求使用https认证,
我们使用http的方式,需要在docker服务中配置信任我们的私有仓库。

vim /etc/docker/daemon.json # 这个文件最后一行不能有逗号!!!
################## file start ##################
{
  "registry-mirrors": ["https://38zi2wqv.mirror.aliyuncs.com"],
  "insecure-registries": ["http://192.168.56.11:5000"]
}
################## file  end ##################

registry-mirrors: docker镜像源指定,这里配置的是阿里云的源
insecure-registries:配置我们的私有仓库
需要重启docker服务

registry仓库的使用验证

docker tag app/jenkins 192.168.56.11:5000/app/jenkins
docker push 192.168.56.11:5000/app/jenkins
docker rm -f jenkins-demo
docker rmi app/jenkins
docker rmi 192.168.56.11:5000/app/jenkins
docker pull 192.168.56.11:5000/app/jenkins
docker run -d --name  jenkins-demo -p 98:22 -p 99:8080 192.168.56.11:5000/app/jenkins

registry没有认证

5.2 Harbor构建docker私有仓库

Harbor是Vmware开源的docker镜像仓库管理工具。
Harbor官网

下载offline版本(内有全部包,无须下载),被墙的话,用浏览器FQ下载。
或者FQ服务器下载,发送过来。

5.2.1 下载工具

yum install -y python-pip
pip install docker-compose
pip list|grep docker-compose
# docker-compose 一个docker的管理工具,可以快捷的启动集群

删除之前创建的实验容器

# 列出所有的容器ID
docker ps -a  -q
# 快速删除 生产禁用!!!
docker rm $(docker ps -a  -q)

5.2.2 下载安装部署

# wget https://storage.googleapis.com/harbor-releases/release-1.6.0/harbor-offline-installer-v1.6.0-rc2.tgz
tar zxf harbor-offline-installer-v1.6.0-rc2.tgz
cd harbor/

cat docker-compose.yml
# 查看这个文件docker-compose.yml,启动的是80 443 4443端口,保证本机没有占用。否则需要更改
# 所以我们需要修改上文配置的daemon.json,去掉5000端口,重启docker服务。

# 更改配置文件 
# 主机名改为本机IP或对外域名 
# 可选协议控制,这里不做更改ui_url_protocol = http
sed -i.ori ‘s#hostname = reg.mydomain.com#hostname = 192.168.56.11#g‘ harbor.cfg
# 默认密码:harbor_admin_password = Harbor12345

### 安装:
# 确认 docker-compose 命令安装正确,且可执行
# 执行安装脚本:
./install.sh
# 安装成功后,查看状态:
docker-compose  ps # 需要在当前目录执行 可执行 stop start 。。

5.2.3 异常处理

界面访问192.168.56.11,Ng502,经过查阅,可能是harbor版本问题
实验改用:harbor-offline-installer-v1.5.1.tgz版本

docker-compose down
重装还不行的话,删除挂载目录,再删除所有镜像。

重新验证:
浏览器访问192.168.56.11

user:admin
pass:Harbor12345 # harbor.cfg 配置文件中指定

5.3 harbor管理

技术分享图片

在harbor新建项目
技术分享图片

在客户端登录测试,并push镜像

# 登录
docker login 192.168.56.11
user:admin
pass:Harbor12345

# 打tag
docker tag app/jenkins  192.168.56.11/app/jenkins
# push镜像
docker push 192.168.56.11/app/jenkins # 注意先创建项目app

在界面查看镜像,可以看到成功推送的镜像。

在其他节点使用Harbor,

  1. 在/etc/docker/daemon.json配置信任
  2. docker login 192.168.56.11





















































以上是关于Docker的主要内容,如果未能解决你的问题,请参考以下文章

Docker教程-1-学习及安装Docker

Docker教程-1-学习及安装Docker

Docker03 Docker基础知识Docker实战

Docker学习__docker命令[docker version 和 docker info]

[转帖]Docker里运行Docker docker in docker(dind)

docker 定时清理docker容器日志