Docker安装及简单操作

一、docker安装

[root@docker01 ~]# yum remove docker docker-common docker-selinux docker-engine

[root@docker01 ~]# yum install -y yum-utils device-mapper-persistent-data lvm2

[root@docker01 ~]# rm -fr /etc/yum.repos.d/local.repo

[root@docker01 ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

[root@docker01 ~]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo

[root@docker01 ~]# sed -i \'s#download.docker.com#mirrors.tuna.tsinghua.edu.cn/docker-ce#g\' /etc/yum.repos.d/docker-ce.repo

[root@docker01 ~]# yum makecache fast

[root@docker01 ~]# yum install docker-ce -y

二、docker的主要组成部分

docker是传统的CS架构分为docker client和docker server,像mysql一样

go语言开发

[root@docker01 ~]# systemctl start docker
[root@docker01 ~]# systemctl enable docker

[root@docker01 ~]# docker version
Client: Docker Engine - Community
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        a872fc2f86
 Built:             Tue Oct  8 00:58:10 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       a872fc2f86
  Built:            Tue Oct  8 00:56:46 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

1.docker主要组件

镜像,容器,仓库, 网络,存储

启动容器必须需要一个镜像,仓库中只存储镜像

容器—镜像—仓库

2.什么是镜像?

系统文件打包就是镜像

三、启动第一个容器

docker的主要目标是”Build,Ship and Run any App,Angwhere”,构建,运输,处处运行
部署服务,环境问题。

一次构建,处处运行。

docker是一种软件的打包技术

传统安装nginx步骤

#源码安装
1.官网下载Nginx源码包wget  
2.tar 
3.创建Nginx用户 

#编译安装
1../config....
2.修改配置文件,
3.启动

docker

# 1.配置docker镜像加速
[root@docker01 ~]# vim /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}	

# 2.跑个容器
[root@docker01 ~]# docker run -d -p 80:80 nginx

# 3.参数解释
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
nginx docker镜像的名字

四、docker镜像管理

1.搜索镜像

[root@docker01 ~]# docker search wordpress

name 名称

description 描述

start 点赞

official 官方

automated 自动创建

选镜像的建议:第一选官方的,没有官方选点赞多的

官方镜像仓库地址:hub.docker.com

# 再装一个容器 发现是从本地找 找不到才去下载
[root@docker01 ~]# docker run -d busybox
Unable to find image \'busybox:latest\' locally
latest: Pulling from library/busybox
bdbbaa22dec6: Pull complete 
Digest: sha256:6915be4043561d64e0ab0f8f098dc2ac48e077fe23f488ac24b665166898115a
Status: Downloaded newer image for busybox:latest
cf89c21ea005ac6f8f053d07f554d6d37f2d512a9a73193820838d28bc77f621

2.获取镜像

[root@docker01 ~]# docker pull alpine:latest
latest: Pulling from library/alpine
e6b0cf9c0882: Pull complete 
Digest: sha256:2171658620155679240babee0a7714f6509fae66898db422ad803b951257db78
Status: Downloaded newer image for alpine:latest
docker.io/library/alpine:latest

官方pull: docker pull centos:6.8(没有指定版本,默认会下载最新版)
**私有仓库pull: **docker pull daocloud.io/huangzhichong/alpine-cn:latest

3.镜像加速器

阿里云加速器,

daocloud加速器,

中科大加速器,

Docker 中国官方镜像加速:https://registry.docker-cn.com

#配置docker镜像加速
vi /etc/docker/daemon.json
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}	

国内源不需要做镜像加速

#官网地址
https://www.daocloud.io/mirror
加速命令
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io


#阿里镜像加速地址
https://cr.console.aliyun.com/cn-hangzhou/instances/repositories
加速命令
mkdir -p /etc/docker
tee /etc/docker/daemon.json <<-\'EOF\'
{
  "registry-mirrors": ["https://ig2l319y.mirror.aliyuncs.com"]
}
EOF

#重启
systemctl daemon-reload
systemctl restart docker

4.docker常用命令

[root@docker01 ~]# docker image 
build  history  import  inspect  load   ls  prune  pull   push   rm    save   tag     
# 查看已装镜像列表
[root@docker01 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              6d5fcfe5ff17        3 days ago          1.22MB
alpine              latest              cc0abc535e36        5 days ago          5.59MB
nginx               latest              231d40e811cd        5 weeks ago         126MB
# 导出镜像
[root@docker01 ~]# docker image save nginx:latest -o docker_nginx.tar.gz
一定是 名称:版本号 
-o 指定包名

[root@docker01 ~]# file docker_nginx.tar.gz 
docker_nginx.tar.gz: POSIX tar archive
[root@docker01 ~]# ll 
-rw-------  1 root root 130173440 Dec 30 09:30 docker_nginx.tar.gz

打包出来就相当于备份出来了

# 删除镜像
[root@docker01 ~]# docker image rm alpine:latest 
正在用的镜像删不掉

[root@docker01 ~]# docker rmi centos:7

docker images|awk \'NR>1{print "docker rmi "$3}\'|bash
docker rmi $(docker images|awk \'NR>1{print $3}\')
docker rmi $(docker images -q)
[root@docker01 ~]# docker save busybox:latest -o docker_busybox.tar.gz
[root@docker01 ~]# scp -rp docker_busybox.tar.gz 10.0.0.6:/root

[root@docker02 ~]# ll
-rw-------  1 root root 1446400 Dec 30 09:54 docker_busybox.tar.gz
# 导入镜像
[root@docker02 ~]# docker image load -i docker_busybox.tar.gz 
195be5f8be1d: Loading layer  1.437MB/1.437MB
Loaded image: busybox:latest
[root@docker02 ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
busybox             latest              6d5fcfe5ff17        3 days ago          1.22MB

五、docker的容器管理

# 创建启动nginx 保持不退出-d
[root@docker01 ~]# docker run -d -p 80:80 nginx:latest 
run(创建并运行一个容器)
-d 放在后台
-p 端口映射
-v  源地址(宿主机):目标地址(容器)
nginx docker镜像的名字

docker run = docker create + docker start
# 进入容器 -it
[root@docker01 ~]# docker run -it --name test nginx:latest /bin/bash
root@0fd575413ecf:/# nginx -v
nginx version: nginx/1.17.6
root@0fd575413ecf:/# 
容器越小越好 所以什么容器就保留什么容器的命令

但是也会留一些简单命令
root@0fd575413ecf:/# hostname -I [容器ip]
172.17.0.2 

root@docker01 ~]# ping 172.17.0.2 [宿主机可以ping通]
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.061 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.037 ms
# 停止容器
[root@docker01 ~]# docker container stop CONTAINER_ID
# 杀死容器
[root@docker01 ~]# docker container kill container_name
# 删除容器
[root@docker01 ~]# docker container rm id或name
# 批量删除容器
[root@docker01 ~]# docker container rm -f `docker ps -a -q`
# 查看容器列表
[root@docker01 ~]# docker container ls(-a -l -q)= docker ps
默认:显示起来的
-a:显示全部
-a -l:显示最后一个
-a -q:打印每个容器的id

# 查看容器的详细信息
[root@docker01 ~]# docker inspect 容器ID
# 进入正在运行的容器 (目的:调试排错)
[root@docker01 ~]# docker exec -it

# 进个容器
[root@docker01 ~]# docker run -it nginx:latest /bin/bash
root@126b976a6b16:/# 
# 另个窗口看看状态
[root@docker01 ~]# docker ps -a -l
CONTAINER ID  IMAGE         COMMAND      CREATED         STATUS        PORTS   NAMES
126b976a6b16  nginx:latest  "/bin/bash"  33 seconds ago  Up 32 seconds 80/tcp  great_saha

# 进入正在运行的容器
[root@docker01 ~]# docker attach 126b976a6b16(id号)
但是这个命令 有个bug 运行在同一个终端 两边会同步操作 (偷偷离开的快捷键ctrl+p松开手后ctrl+q)

# 进入正在运行的容器
[root@docker01 ~]# docker exec -it 126b976a6b16 /bin/bash
root@126b976a6b16:/# 
# 复制宿主机文件到容器里
[root@docker01 ~]# docker cp xiaoniao.zip 容器id

六、docker容器的网络访问(端口映射)

通过iptables来实现的端口映射

1.为什么要做端口映射?

因为容器用的是内网ip 外界访问只能访问到它的宿主机 所要在宿主机上做一个端口映射

nat模式

宿主机是一个网段 容器也是一个网段

[root@docker01 ~]# docker run -it centos:6.9 
[root@d74e2af7db5a /]# ping 223.5.5.5
bash: ping: command not found

[root@docker02 ~]# yum provides ping
iputils

[root@d74e2af7db5a /]# yum install iputils -y

[root@d74e2af7db5a /]# ping 223.5.5.5
PING 223.5.5.5 (223.5.5.5) 56(84) bytes of data.
64 bytes from 223.5.5.5: icmp_seq=1 ttl=127 time=13.1 ms
64 bytes from 223.5.5.5: icmp_seq=2 ttl=127 time=8.20 ms
# 每当启动docker时 内核转发参数自动变1
[root@docker01 ~]# sysctl -a|grep ipv4|grep forward
net.ipv4.ip_forward = 1

2.端口映射

1)-p hostPort:containerPort

[root@docker01 ~]# docker run -d -p 80:80 nginx:latest 
178727ce6647cc2bebd20bc3c6ac361e6dba0e6531bb0736ff2cdf1b0f6efbbb

[root@docker01 ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                NAMES
178727ce6647        nginx:latest        "nginx -g \'daemon of…"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp   admiring_faraday

杀死容器 网页连不上了

2)-p ip:hostPort:containerPort

多个容器同时使用8080端口

# 配置多个ip
[root@docker01 ~]# ifconfig eth0:1 10.0.0.23/24
[root@docker01 ~]# ifconfig
eth0:1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.0.0.23  netmask 255.255.255.0  broadcast 10.0.0.255
        ether 00:0c:29:3e:b8:e2  txqueuelen 1000  (Ethernet)

# 同时起了两个容器
[root@docker01 ~]# docker run -d -p 10.0.0.5:8080:80 nginx:latest
2c4ad02a62184b5bb6ed46a1471eb666cce821208780b3e839992c09d0fecf1f
[root@docker01 ~]# docker run -d -p 10.0.0.23:8080:80 nginx:latest
993bdabc1f6823398d47da011b7af1ea8c6dfbe13208599285e7a354e543960b

但这个并不是完全一样的

# 进入容器测试
[root@docker01 ~]# docker exec -it 993bdabc1f /bin/bash
root@993bdabc1f68:/# 
root@993bdabc1f68:/usr/share/nginx# cd /usr/share/nginx/html/
root@993bdabc1f68:/usr/share/nginx/html# ls
50x.html  index.html
root@993bdabc1f68:/usr/share/nginx/html# echo 10.0.0.13 > index.html 

3)-p ip::containerPort(随机端口)

[root@docker01 ~]# docker run -d -p 10.0.0.23::80 nginx:latest
942d13e0e7b3746bdae8e9c6e0004ea599e3cf23207e27b01e1251dacad6b97c

[root@docker01 ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
942d13e0e7b3        nginx:latest        "nginx -g \'daemon of…"   21 seconds ago      Up 20 seconds       10.0.0.23:4000->80/tcp   silly_fermat

4) -p hostPort:containerPort/udp [udp协议]

[root@docker01 ~]# iptables -t nat -L -n
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.5             tcp dpt:8080 to:172.17.0.3:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.23            tcp dpt:8080 to:172.17.0.4:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.23            tcp dpt:4000 to:172.17.0.5:80

[root@docker01 ~]# docker run -d -p 10.0.0.23::80/udp nginx:latest
6e4f221506d4590debadd39413e2662c96afeecc6daf30150297a89e4be7e0ed

[root@docker01 ~]# iptables -t nat -L -n
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.2:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.5             tcp dpt:8080 to:172.17.0.3:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.23            tcp dpt:8080 to:172.17.0.4:80
DNAT       tcp  --  0.0.0.0/0            10.0.0.23            tcp dpt:4000 to:172.17.0.5:80
DNAT       udp  --  0.0.0.0/0            10.0.0.23            udp dpt:4000 to:172.17.0.6:80

5) -p 81:80 –p 443:443

6) docker run -P (随机端口)

7)多容器不同端口映射

访问 8080 端口,展示 xiaoniao
访问 8090 端口,展示游戏集合页面

# 1.编辑配置文件
cat >/data/game.conf<<EOF 
server { 
    listen       8080; 
    server_name  localhost; 
    location / { 
        root   /opt/game/; 
        index  index.html index.htm; 
    } 
} 
 
server { 
    listen       8090; 
    server_name  localhost; 
    location / { 
        root   /opt/xiaoniao/; 
        index  index.html index.htm; 
    } 
} 
EOF 


# 2.上传代码目录 
[root@docker01 /data]# ll  
总用量 18896 
drwxr-xr-x 5 root root       73 9 月   7 23:03 game 
-rw-r--r-- 1 root root      309 9 月   7 22:57 game.conf 
-rw-r--r-- 1 root root 19248295 8 月  28 09:48 html5.zip 
drwxr-xr-x 3 root root       92 9 月   7 22:15 xiaoniao 
-rw-r--r-- 1 root root    91014 9 月   7 22:11 xiaoniaofeifei.zip 


# 3.创建容器并挂载   
docker run -d -p 8080:8080 -p 8090:8090 -v /data/game.conf:/etc/nginx/conf.d/game.conf -v 
/data/game:/opt/game -v /data/xiaoniao:/opt/xiaoniao nginx:latest    


# 4.访问测试 
10.0.0.5:8080 
10.0.0.5:8090

七、docker的数据卷管理

1.目录挂载

# 拖个之前玩过的包 解压出html页面
[root@docker01 ~]# cd /opt
[root@docker01 /opt]# mkdir xiaoniao
[root@docker01 /opt]# cd xiaoniao/
[root@docker01 /opt/xiaoniao]# rz -E
rz waiting to receive.
[root@docker01 /opt/xiaoniao]# unzip xiaoniaofeifei.zip             
[root@docker01 /opt/xiaoniao]# ls
2000.png  21.js  icon.png  img  index.html  sound1.mp3  xiaoniaofeifei.zip
[root@docker01 ~]# docker run -d -p 80:80 -v /opt/xiaoniao:/usr/share/nginx/html nginx:latest 
指定端口 指定目录 指定镜像

/usr/share/nginx/html # 容器页面目录 定好的

修改文件什么的不需要进入容器 直接在外面改就行

2.卷挂载

(第一次卷是空,会把容器的数据复制到卷中,如果卷里面有数据,把卷数据的反挂载到容器中)

[root@docker01 ~]# docker volume 
create   inspect  ls       prune    rm       
[root@docker01 ~]# docker volume ls [啥也没有]
DRIVER              VOLUME NAME
# 创建一个叫xiaoniao的卷 
[root@docker01 ~]# docker run -d -p 81:80 -v xiaoniao:/usr/share/nginx/html nginx:latest 
ee562aefdfcd503e70332b4677dc0728398e4e101b8f57b671bcf2498b1083e0
[root@docker01 ~]# docker volume ls
DRIVER              VOLUME NAME
local               xiaoniao

# 查看卷的详细信息 找到挂载目录
[root@docker01 ~]# docker volume inspect xiaoniao
[
    {
        "CreatedAt": "2019-12-30T14:39:11+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/xiaoniao/_data",
        "Name": "xiaoniao",
        "Options": null,
        "Scope": "local"
    }
]
# 进挂载目录修改html
[root@docker01 ~]# cd /var/lib/docker/volumes/xiaoniao/_data
[root@docker01 /var/lib/docker/volumes/xiaoniao/_data]# ls
50x.html  index.html
[root@docker01 /var/lib/docker/volumes/xiaoniao/_data]# \cp -a /opt/xiaoniao/* .
[root@docker01 /var/lib/docker/volumes/xiaoniao/_data]# ls
2000.png  21.js  50x.html  icon.png  img  index.html  sound1.mp3  xiaoniaofeifei.zip
[root@docker01 /var/lib/docker/volumes/xiaoniao/_data]# 

**可以共用一个卷 **

# 直接会有数据 因为卷数据反挂容器了
[root@docker01 ~]# docker run -d -p 82:80 -v xiaoniao:/usr/share/nginx/html nginx:latest 
52a005fb921bf1d23899223b911b6cf9ff17dada27287cbce1b4fc41aa3a34d3

八、手动制作docker镜像

1.制作docker镜像过程:

  • 启动一个基础容器(选一个系统版本 centos,ubuntu,alpine…)

​ yum xxxx

  • 2.把容器提交为镜像
  • 3.测试镜像

2.做镜像

  • 启动一个基础容器
# 启动基础镜像
[root@docker01 ~]# docker run -it centos:6.9 
[root@3bb821b1f293 /]# 

# 配置源[注意版本]
[root@3bb821b1f293 /]# curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@3bb821b1f293 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

# 安装nginx服务
[root@3bb821b1f293 /]# yum install nginx -y

# 拖个首页包
[root@3bb821b1f293 /]# yum install lrzsz -y
[root@3bb821b1f293 /]# cd /usr/share/nginx/html
[root@3bb821b1f293 html]# yum install unzip -y
[root@3bb821b1f293 html]# unzip xiaoniaofeifei.zip 
[root@3bb821b1f293 html]# ls
2000.png  404.html  icon.png  index.html      poweredby.png  xiaoniaofeifei.zip
21.js     50x.html  img       nginx-logo.png  sound1.mp3
  • 把容器提交为镜像
# 退出容器 容器死了
[root@docker01 ~]# docker ps -a -l
[root@docker01 ~]# docker ps -a -l
CONTAINER ID    IMAGE       COMMAND       CREATED         STATUS                  
3bb821b1f293    centos:6.9  "/bin/bash"   13 minutes ago  Exited (0) About a minute ago 

# 提交 名字为xiaoniao:v1
[root@docker01 ~]# docker container commit 3bb821b1f293 xiaoniao:v1
sha256:a203dcdb4170dc8054543bfbb66d1c090d3ed14ef0f54158899593b193908db5

# 查看镜像
[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xiaoniao            v1                  a203dcdb4170        2 minutes ago       449MB
busybox             latest              6d5fcfe5ff17        3 days ago          1.22MB
nginx               latest              231d40e811cd        5 weeks ago         126MB
centos              6.9                 adf829198a7f        17 months ago       195MB
出现小鸟v1  但是很大 [centos做镜像有点大]
  • 测试
[root@docker01 ~]# docker run -d -p 80:80 xiaoniao:v1
[root@docker01 ~]# docker run -d -it -p 80:80 xiaoniao:v1 
什么参数都不加直接启动容器 容器秒死
加 -it 参数容器不会死 但是服务起不来 只能进容器启动服务

[root@docker01 ~]# docker run -d -it -p 80:80 xiaoniao:v1 nginx -g \'daemon off;\'
1caf960e9f32f9b895b346f727f9f606fdcc123eb082e1ecad5ed0cf27ae7327
一步到位启动

3.多服务 云盘镜像

制作一个kodexplorer网盘docker镜像。nginx + php-fpm(httpd + php)

  • 启动一个基础容器
  • 可以基于nginx启这个基础容器 因为上面都做好了
[root@docker01 ~]# docker run -it xiaoniao:v1 /bin/bash
[root@8bd1948d5d56 /]# yum install php-fpm -y
[root@8bd1948d5d56 /]# vi /etc/nginx/conf.d/kod.conf
server {
  listen 80;
  server_name localhost;
  location / {
      root   /code;
      index  index.php index.html index.htm;
  }
        location ~ \.php$ {
            root           /code;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /code$fastcgi_script_name;
            include        fastcgi_params;
        }


}
[root@8bd1948d5d56 /]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[root@8bd1948d5d56 /]# mkdir /code
[root@8bd1948d5d56 /]# service nginx start
Starting nginx:                                            [  OK  ]
[root@8bd1948d5d56 /]# service php-fpm start
Starting php-fpm:                                          [  OK  ]
[root@8bd1948d5d56 code]# ls
kodexplorer4.40.zip 
[root@8bd1948d5d56 code]# unzip kodexplorer4.40.zip 

# 修改权限 先保证用户一致
[root@8bd1948d5d56 code]# vi /etc/php-fpm.d/www.conf
user = nginx
group = nginx
[root@8bd1948d5d56 code]# service php-fpm restart

[root@8bd1948d5d56 code]# chown -R nginx:nginx .
  • 把容器提交为镜像

    [注:我没有退出容器 都是开了新的窗口 如果退容器操作 偷偷退出 ctrl p +ctrl q]

[root@docker01 ~]# docker commit 8bd1948d5d56 kod:v1
sha256:6ae314fd865f58349d1a7313755e93216c24d22953a9bf6a1c4b037b3a71c8fe

[root@docker01 ~]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
kod                 v1                  6ae314fd865f        25 seconds ago      618MB
xiaoniao            v1                  a203dcdb4170        48 minutes ago      449MB
busybox             latest              6d5fcfe5ff17        3 days ago          1.22MB
nginx               latest              231d40e811cd        5 weeks ago         126MB
centos              6.9                 adf829198a7f        17 months ago       195MB
  • 测试

初始命令执行多条 比如启nginx和php 这个时候直接写个脚本 初始脚本就行

[root@8bd1948d5d56 /]# vi /init.sh
#!/bin/bash
service start php-fpm
nginx -g \'daemon off;\'

# 给个执行权限
[root@8bd1948d5d56 /]# chmod +x /init.sh

# 修改了容器 所以需要重新提交 
[root@docker01 ~]# docker commit 8bd1948d5d56 kod:v2
sha256:aed221559af67b63fb5d6e148dcf676e2b462426820bc0f32cb5f70b9a580383

# 启动容器 检查存活
[root@docker01 ~]# docker run -d -p 80:80 kod:v2 /bin/bash /init.sh
aa688297e10f499269b6f4f3d0cc73a773dc716da9bdf4066f5abdb1c828df37
[root@docker01 ~]# docker ps -a -l

# 进容器下载缺失的东西 [每次id不一样 要注意]
[root@docker01 ~]# docker exec -it 93f6b36fcd5e /bin/bash
[root@93f6b36fcd5e /]# 

# php-GD库安装需要的模块
[root@93f6b36fcd5e /]# yum install php-mbstring php-gd

# 重启
[root@93f6b36fcd5e /]# service php-fpm restart
Stopping php-fpm:                                          [  OK  ]
Starting php-fpm:                                          [  OK  ]

# 再提交一次
[root@93f6b36fcd5e /]# exit
exit
[root@docker01 ~]# docker commit 93f6b36fcd5e kod:v4
sha256:3f8e74241285ac66b324a4abb4a6767a61a555d1f8490600a5b57f68e806c7d8
[root@docker01 ~]# docker rm -f `docker ps -a -q`

# 测试
[root@docker01 ~]# docker run -d -p 80:80 kod:v4 /bin/bash /init.sh
a28f441cf37fb674ed693ebdcf717854b35e78426712e95586e861145d124061

九、dockerfile[重中之重]自动构建docker镜像

手动做镜像:大小几百M+,开发修改代码,我们需要启动容器拷贝代码,重新提交什么的

自动做镜像:类似ansible剧本,大小几kb,dockerfile不变,docker build一条完成更新

dockerfile 把手动做镜像的下载步骤什么的写成剧本形势

dockerfile 支持自定义容器的初始命令

1.dockerfile组成部分

   基础镜像信息       FROM  centos:6.9
​	制作镜像操作指令    RUN yum install openssh-server -y
​	容器启动时执行指令  CMD ["/bin/bash"]

2.dockerfile常用指令

FROM        # 这个镜像的妈妈是谁?(指定基础镜像)
MAINTAINER  # 告诉别人,谁负责养它?(指定维护者信息,可以没有)
LABLE       # 描述,标签
RUN         # 你想让它干啥(在命令前面加上RUN即可)启一个新容器
ADD         # 给它点创业资金(会自动解压tar)  制作docker基础的系统镜像
WORKDIR     # 我是cd,今天刚化了妆(设置当前工作目录)
VOLUME      # 给它一个存放行李的地方(设置卷,挂载主机目录)持久化
EXPOSE      # 它要打开的门是啥(指定对外的端口)(-P 随机端口)
CMD         # 奔跑吧,兄弟!(指定容器启动后的要干的事情)(容易被替换)

3.dockerfile其他指令

COPY        # 复制文件(不会解压)rootfs.tar.gz
ENV         # 环境变量
ENTRYPOINT  # 容器启动后执行的命令(无法被替换,启容器的时候指定的命令,会被当成参数)

4.总结步骤

1.手动做一次镜像
2.根据历史命令写dockerfile
3.使用dockerfile构建镜像
4.测试镜像

5.dockerfile1实践

# 所有的dockerfile都放在一起 dockerfile目录下
[root@docker01 ~]# cd /opt
[root@docker01 /opt]# mkdir dockerfile
[root@docker01 /opt]# cd dockerfile/
[root@docker01 /opt/dockerfile]# mkdir nginx
[root@docker01 /opt/dockerfile]# cd nginx/
[root@docker01 /opt/dockerfile/nginx]# 

# 写dockerfile 名字必须以dockerfile命名
[root@docker01 /opt/dockerfile/nginx]# vim dockerfile
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx unzip -y
CMD  ["nginx","-g","daemon off;"]

# 做镜像
[root@docker01 /opt/dockerfile/nginx]# docker image build --network=host -t centos_nginx:v1 /opt/dockerfile/nginx/
-t:取名字
--network=host:使用宿主机网络 宿主机host劫持 速度变快
Successfully built 4bc88d907ec7
Successfully tagged centos_nginx:v1

# 测试
[root@docker01 /opt/dockerfile/nginx]# docker run -d -p 88:80 centos_nginx:v1 
06bf747b508067dd02f95665e5000f318ba4acbc6c9ff1687b837d2215816761
[root@docker01 /opt/dockerfile/nginx]# docker ps -a -l

6.dockerfile2实践

避免出现交互式问题

WORKDIR

[root@docker01 /opt/dockerfile]# mkdir xiaoniao
[root@docker01 /opt/dockerfile]# cd xiaoniao/
[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx -y
WORKDIR /usr/share/nginx/html
RUN  curl -o xiaoniaofeifei.zip http://192.168.12.202/file/xiaoniaofeifei.zip
RUN  unzip xiaoniaofeifei.zip
CMD  ["nginx","-g","daemon off;"]

[root@docker01 /opt/dockerfile/xiaoniao]# docker image build -t xiaoniao:v2 .

7.dockerfile3实践

ADD

[root@docker01 /opt/dockerfile/xiaoniao]# cp -a /opt/xiaoniao .
[root@docker01 /opt/dockerfile/xiaoniao]# ll
total 4
-rw-r--r-- 1 root root 364 Dec 30 18:29 dockerfile
drwxr-xr-x 3 root root 124 Dec 30 14:25 xiaoniao
[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile 
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx -y
WORKDIR /usr/share/nginx/html
ADD  xiaoniao .
CMD  ["nginx","-g","daemon off;"]

[root@docker01 /opt/dockerfile/xiaoniao]# docker image build -t xiaoniao:v3 .
[root@docker01 /opt/dockerfile/xiaoniao]# docker run -d -p 82:80 xiaoniao:v3 
f91022430a17a2568e07efd3ca490f843fdc43f273801080383f9ba593259945
[root@docker01 /opt/dockerfile/xiaoniao]# docker ps -a -l

8.dockerfile4实践

VOLUME

# 查看挂载卷 啥也没有
[root@docker01 /opt/dockerfile/xiaoniao]# docker volume ls
DRIVER              VOLUME NAME

# 编辑dockerfile
[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile 
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx -y
ADD  xiaoniao /usr/share/nginx/html
VOLUME /usr/share/nginx/html
CMD  ["nginx","-g","daemon off;"]

# 一键提交
[root@docker01 /opt/dockerfile/xiaoniao]# docker build -t xiaoniao:v4 .

# 启动容器
用--name取个名字 后面好使用 好区分
[root@docker01 /opt/dockerfile/xiaoniao]# docker run --name xiaoniao -d -p 91:80 xiaoniao:v4
301f158a84b4757e0134443140da8a019f7e1fb3b0f4de9316082c73b0541f65

# 查看挂载卷
[root@docker01 /opt/dockerfile/xiaoniao]# docker volume ls
DRIVER              VOLUME NAME
local               efa95b60c21beb0cf8f942bf42f59a7f623c793380ad9e250d3057f3d0a028ae

# 查看详情并修改页面
[root@docker01 /opt/dockerfile/xiaoniao]# docker container inspect xiaoniao
  "Source": "/var/lib/docker/volumes/efa95b60c21beb0cf8f942bf42f59a7f623c793380ad9e250d3057f3d0a028ae/_data",
[root@docker01 /opt/dockerfile/xiaoniao]# cd /var/lib/docker/volumes/efa95b60c21beb0cf8f942bf42f59a7f623c793380ad9e250d3057f3d0a028ae/_data

[root@docker01 _data]# vim index.html 
<title>大鸟飞飞</title>


# 再次启动个容器
[root@docker01 _data]# docker stop xiaoniao

[root@docker01 _data]# docker run -d -p 92:80 --volumes-from xiaoniao xiaoniao:v4
就算xiaoniao死了了 还是可以用别的端口跟xiaoniao挂一样的卷

9.dockerfile5实践

EXPOSE

[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile 
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx -y
ADD  xiaoniao /usr/share/nginx/html
VOLUME /usr/share/nginx/html
EXPOSE 80 22
CMD  ["nginx","-g","daemon off;"]

[root@docker01 /opt/dockerfile/xiaoniao]# docker build -t xiaoniao:v5 .

# 给了随机端口映射 一个22 一个80
[root@docker01 /opt/dockerfile/xiaoniao]# docker run -d -P xiaoniao:v5
e7b882318f3f350499df9c96d65d09ace3a22a19b661e645f4bc875dbebb85a7
[root@docker01 /opt/dockerfile/xiaoniao]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
e7b882318f3f        xiaoniao:v5         "nginx -g \'daemon of…"   28 seconds ago      Up 26 seconds       0.0.0.0:4001->22/tcp, 0.0.0.0:4000->80/tcp   eager_pasteur

10.dockerfile6实践

ENTRYPOINT

初始化命令可以被覆盖 如果不小心输错 就会一直处于错误状态

[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.re
RUN  yum install nginx -y
ADD  xiaoniao /usr/share/nginx/html
VOLUME /usr/share/nginx/html
EXPOSE 80 22
ENTRYPOINT  ["nginx","-g","daemon off;"]

[root@docker01 /opt/dockerfile/xiaoniao]# docker build -t xiaoniao:v6 .

# 后面填错了还是能起来 但是会秒死
[root@docker01 /opt/dockerfile/xiaoniao]# docker run -d -P xiaoniao:v6 dslakljdkj
d6f482adf9d26da7df76ed7af7ce84734326a7917b8c8c00864c4bb26fcb90b3
[root@docker01 /opt/dockerfile/xiaoniao]# docker ps -a -l
Exited

# 可以用脚本传参方式解决
[root@docker01 /opt/dockerfile/xiaoniao]# vim dockerfile 
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install nginx -y
ADD  xiaoniao /usr/share/nginx/html
VOLUME /usr/share/nginx/html
EXPOSE 80 22
ADD  init.sh /init.sh
ENTRYPOINT  ["/bin/bash","/init.sh"]

[root@docker01 /opt/dockerfile/xiaoniao]# vim init.sh
#!/bin/bash
nginx -g \'daemon off;\'

# 查看状态 存活
[root@docker01 /opt/dockerfile/xiaoniao]# docker build -t xiaoniao:v7 .
[root@docker01 /opt/dockerfile/xiaoniao]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                        NAMES
aef1ff663faf        xiaoniao:v8         "/bin/bash /init.sh …"   6 seconds ago       Up 5 seconds        0.0.0.0:4013->22/tcp, 0.0.0.0:4012->80/tcp   romantic_newton

11.dockerfile7实践

ENV

[root@docker01 /opt/dockerfile]# mkdir mysql
[root@docker01 /opt/dockerfile]# cd mysql
[root@docker01 /opt/dockerfile/mysql]# docker run -it -p 3306:3306 centos:6.9

[root@bfd8749c5c32 /]#  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@bfd8749c5c32 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

[root@bfd8749c5c32 /]# yum install mysql-server -y
[root@bfd8749c5c32 /]# service mysqld start
[root@bfd8749c5c32 /]# mysqladmin -uroot password "123456"

[root@bfd8749c5c32 /]# ps -ef|grep mysqld_safe
root        184      1  0 11:49 pts/0    00:00:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
[root@bfd8749c5c32 /]# vi init.sh
/bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
# 根据手动构建写dockerfile
[root@docker01 /opt/dockerfile/mysql]# vim dockerfile
FROM centos:6.9
RUN  curl -o  /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
RUN  curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo
RUN  yum install mysql-server -y
RUN  service mysqld start
ADD  init.sh /init.sh
ENV  MYSQL_ROOT=123456
CMD  ["/bin/bash","/init.sh"]


# 写脚本 [密码设置成传参 不要一直一样 如果不传参默认用dockerfile默认密码]
[root@docker01 /opt/dockerfile/mysql]# vim init.sh
#!/bin/bash
service mysqld start
mysqladmin -uroot password "$MYSQL_ROOT"
service mysqld stop
/bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql
# 创建镜像
[root@docker01 /opt/dockerfile/mysql]# docker build -t mysql:v1 .

# 启动容器 【没有传参】
[root@docker01 /opt/dockerfile/mysql]# docker run -d mysql:v1
b69f618c245be97ba641e341aed029dd4dfd2c599d523fa6fa44977ca4bc8ea3

# 进入容器 测试
[root@docker01 ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
c1c6a8efc1be        mysql:v1            "/bin/bash /init.sh"   12 seconds ago      Up 10 seconds                           upbeat_khorana
[root@docker01 ~]# docker exec -it c1c6a8efc1be /bin/bash

[root@c1c6a8efc1be /]# mysql
ERROR 1045 (28000): Access denied for user \'root\'@\'localhost\' (using password: NO)
[root@c1c6a8efc1be /]# mysql -uroot -p123456
mysql> 
# 创建镜像
[root@docker01 /opt/dockerfile/mysql]# docker build -t mysql:v3 .
    
# 启动容器 【传参】
[root@docker01 /opt/dockerfile/mysql]# docker run -d -e "MYSQL_ROOT=123" mysql:v3
fd1101936fb73fc9c72c8c75f96157c6132266766d15c03a5b4e1c022c9d0238

# 进入容器 测试
[root@docker01 ~]# docker ps -a -l
CONTAINER ID        IMAGE               COMMAND                CREATED             STATUS              PORTS               NAMES
fd1101936fb7        mysql:v3            "/bin/bash /init.sh"   6 seconds ago       Up 5 seconds                            unruffled_varahamihira

[root@docker01 ~]# docker exec -it fd1101936fb7 /bin/bash
[root@fd1101936fb7 /]# mysql -uroot -p123456
ERROR 1045 (28000): Access denied for user \'root\'@\'localhost\' (using password: YES)
[root@fd1101936fb7 /]# mysql -uroot -p123
mysql> 

12.使用dockerfile创建云盘镜像

[root@d0c987bcefa2 /]# cat /etc/nginx/conf.d/cloud.conf    
server { 
    listen 80; 
    server_name localhost; 
    root /code; 
    index index.php index.html; 
 
    location ~ \.php$ { 
        root /code; 
        fastcgi_pass 127.0.0.1:9000; 
        fastcgi_index index.php; 
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; 
        include fastcgi_params; 
    } 
} 
# 1.准备需要的文件 
[root@docker01 ~/dockerfile/kod]# ls 
CentOS-Base.repo  cloud.conf  dockerfile  epel.repo  init.sh  kodexplorer4.40.zip  nginx.repo 


# 2.编写 dockerfile 
[root@docker01 ~/dockerfile/kod]# cat dockerfile  
FROM centos:latest 

ADD CentOS-Base.repo  /etc/yum.repos.d/CentOS-Base.repo 
ADD epel.repo  /etc/yum.repos.d/epel.repo 
ADD nginx.repo  /etc/yum.repos.d/nginx.repo 
RUN yum install nginx php-fpm unzip php-gd php-mbstring -y  
 
RUN rm -rf /etc/nginx/conf.d/default.conf  
RUN sed -i \'/^user/c user = nginx\' /etc/php-fpm.d/www.conf 
RUN sed -i \'/^group/c group = nginx\' /etc/php-fpm.d/www.conf 
RUN sed -i \'/daemonize/s#no#yes#g\' /etc/php-fpm.conf    
ADD cloud.conf /etc/nginx/conf.d/cloud.conf 
 
RUN   mkdir /code 
WORKDIR /code 
ADD kodexplorer4.40.zip /code/kodexplorer4.40.zip  

RUN unzip kodexplorer4.40.zip  
RUN chown -R nginx:nginx . 
VOLUME /code 
 
ADD init.sh  /init.sh 
EXPOSE 80 
 
CMD ["/bin/bash","/init.sh"] 


# 3.构建新镜像 
[root@docker01 ~/dockerfile/kod]# docker build --network=host -t centos_kod:v1 . 
[root@docker01 ~/dockerfile/kod]# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE 
centos_kod          v1                  87071ea7c86b        2 minutes ago       465MB 


# 4.基于新镜像运行容器 
[root@docker01 ~/dockerfile/kod]# docker run -d -p 80:80 centos_kod:v1 
4d1007d7194d434248762e5aca76070206643f0f0f533f2112d0359b25fe7ba

十、docker镜像的分层(kvm 链接克隆,写时复制的特性)

FROM RUN ADD 都会开一个分层

1.查看分层

# 查看所有镜像
[root@docker01 ~]# docker images

# 删除<none>镜像
[root@docker01 ~]# docker image prune
# 创建dockerfile目录 考个文件过去
[root@docker01 ~]# cd /opt/dockerfile/
[root@docker01 /opt/dockerfile]# mkdir test
[root@docker01 /opt/dockerfile]# cd test/
[root@docker01 /opt/dockerfile/test]# cp /etc/services .
[root@docker01 /opt/dockerfile/test]# ls
services

# 编辑dockerfile 把目录放进容器的/opt下
[root@docker01 /opt/dockerfile/test]# vim dockerfile
FROM busybox:latest
ADD  services /opt

# build镜像
[root@docker01 /opt/dockerfile/test]# docker image build -t test:v1 .

# 保存镜像
[root@docker01 /opt/dockerfile/test]# docker save test:v1 -o docker_test.tar.gz
[root@docker01 /opt/dockerfile/test]# ls
dockerfile  docker_test.tar.gz  services

# 镜像导出至windows
[root@docker01 /opt/dockerfile/test]# sz docker_test.tar.gz

解压之后出现两个目录 说明分成两层

进目录继续解压 会出现完整系统目录

# 传给另一台服务器
[root@docker01 /opt/dockerfile/test]# scp docker_test.tar.gz 10.0.0.6:/root

# 上传镜像 发现是两层
[root@docker02 ~]# docker load -i docker_test.tar.gz 
195be5f8be1d: Loading layer  1.437MB/1.437MB
254fbd52eeb8: Loading layer  672.3kB/672.3kB
Loaded image: test:v1

2.镜像分层的好处

复用,节省磁盘空间,相同的内容只需加载一份到内存。
修改dockerfile之后,再次构建速度快

3.dockerfile优化

1:尽可能选择体积小linux,alpine

2:尽可能合并RUN指令,清理无用的文件(yum缓存,源码包)

3:修改dockerfile,把变化的内容尽可能放在dockerfile结尾

4: 使用.dockerignore,减少不必要的文件ADD . /html

vim .dockerignore 
这里面写你要忽略的文件名  

就是你在特定目录下传镜像 特定目录下有你不需要的东西 比如压缩包什么的?
这些创镜像的时候就可以不要 放在这个配置文件里就好

4.优化前后对比

代码不同

大小不同

分层不同

版权声明:本文为MENGSHIYU原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/MENGSHIYU/p/12132960.html