Docker安装及简单操作
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.优化前后对比
代码不同
大小不同
分层不同