目录
Docker 是一个开源的应用容器引擎,主要利用 linux 内核 namespace 实现沙盒隔离,用
cgroup 实现资源限制
一、Docker镜像下载与安装
下载地址:docker-ce镜像-docker-ce下载地址-docker-ce安装教程-阿里巴巴开源镜像站
配置源
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# curl https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -o docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2081 100 2081 0 0 6282 0 --:--:-- --:--:-- --:--:-- 6287
[root@server1 yum.repos.d]# vim docker-ce.repo
安装centOS源
centos镜像-centos下载地址-centos安装教程-阿里巴巴开源镜像站
[root@server1 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 2523 100 2523 0 0 8976 0 --:--:-- --:--:-- --:--:-- 8978
[root@server1 yum.repos.d]# vim CentOS-Base.repo
[extras]
name=CentOS-$releasever - Extras - mirrors.aliyun.com
failovermethod=priority
baseurl=http://mirrors.aliyun.com/centos/7/extras/$basearch/
gpgcheck=0
gpgkey=http://mirrors.aliyun.com/centos/RPM-GPG-KEY-CentOS-7
只激活[extras]
其他都enabled=0
安装docker-ce
[root@server1 yum.repos.d]# yum install -y docker-ce
[root@server1 yum.repos.d]# systemctl enable --now docker
[root@server1 yum.repos.d]# docker info
查看有警告
是网桥有问题,配置网桥
[root@server1 yum.repos.d]# cd /etc/docker/
[root@server1 docker]# sysctl -a |grep bridge-nf-call-iptables
net.bridge.bridge-nf-call-iptables = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.docker0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth0.stable_secret"
sysctl: reading key "net.ipv6.conf.eth1.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
[root@server1 docker]# vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
[root@server1 docker]# sysctl --system
测试:下载容器库中的数据
[root@server1 ~]# docker pull yakexi007/game2048
Using default tag: latest
latest: Pulling from yakexi007/game2048
534e72e7cedc: Pull complete
f62e2f6dfeef: Pull complete
fe7db6293242: Pull complete
3f120f6a2bf8: Pull complete
4ba4e6930ea5: Pull complete
Digest: sha256:8a34fb9cb168c420604b6e5d32ca6d412cb0d533a826b313b190535c03fe9390
Status: Downloaded newer image for yakexi007/game2048:latest
docker.io/yakexi007/game2048:latest
[root@server1 ~]# docker run -d --name demo -p 80:80 yakexi007/game2048
dcda3e27fc9e553043aeee96971547d1a2ac92ef897a1871a4e1bd435a8a78cf
访问172.25.6.1
删除
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
dcda3e27fc9e yakexi007/game2048 "/bin/sh -c 'sed -i …" About a minute ago Up About a minute 0.0.0.0:80->80/tcp, :::80->80/tcp, 443/tcp demo
[root@server1 ~]# docker rm -f demo
demo
安装 busybox
[root@server1 ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
5cc84ad355aa: Pull complete
Digest: sha256:5acba83a746c7608ed544dc1533b87c737a0b0fb730301639a0179f9344b1678
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest beae173ccac6 4 days ago 1.24MB
yakexi007/game2048 latest 19299002fdbe 5 years ago 55.5MB
[root@server1 ~]# docker run -it --name demo busybox 这里输入命令,ctrl d退出
/ # ls
bin dev etc home proc root sys tmp usr var
/ # touch file
/ # ls
bin dev etc file home proc root sys tmp usr var
/ # rm -f file
/ # ls
bin dev etc home proc root sys tmp usr var
/ #
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker ps -a 查看进程
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad118e314332 busybox "sh" 54 seconds ago Exited (0) 29 seconds ago demo
[root@server1 ~]# docker rm demo 删除进程
demo
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
二、 镜像的分层结构
- 共享宿主机的kernel
- base镜像提供的是最小的Linux发行版
- 同一docker主机支持运行多种Linux发行版
- 采用分层结构的最大好处是:共享资源
- Copy-on-Write 可写容器层
- 容器层以下所有镜像层都是只读的
- docker从上往下依次查找文件
- 容器层保存镜像变化的部分,并不会对镜像本身进行任何修改
- 一个镜像最多127层
[root@server1 ~]# docker start demo
demo
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bbb644964514 busybox "sh" 4 minutes ago Up 6 seconds demo
[root@server1 ~]# docker attach demo
/ # ls
bin dev etc home proc root sys tmp usr var
/ # touch file1
/ # touch file2
/ # touch file3
/ # ls
bin etc file2 home root tmp var
dev file1 file3 proc sys usr
/ # read escape sequence ##ctrl q p后台运行
三、 镜像的构建
docker commit
docker commit 构建新镜像三部曲
- 运行容器
- 修改容器
- 将容器保存为新的镜像
缺点:
效率低、可重复性弱、容易出错
使用者无法对镜像进行审计,存在安全隐患
[root@server1 ~]# docker commit demo demo:v1 提交镜像
sha256:c7eba38f8d62ca0b8c5968d0676fbe96eafe33fd4b87700b08c531e164290835
[root@server1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
demo v1 c7eba38f8d62 25 seconds ago 1.24MB
busybox latest beae173ccac6 4 days ago 1.24MB
yakexi007/game2048 latest 19299002fdbe 5 years ago 55.5MB
[root@server1 ~]# docker history demo:v1
IMAGE CREATED CREATED BY SIZE COMMENT
c7eba38f8d62 44 seconds ago sh 51B
beae173ccac6 4 days ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4… 1.24MB
[root@server1 ~]# docker history busybox:latest
IMAGE CREATED CREATED BY SIZE COMMENT
beae173ccac6 4 days ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 4 days ago /bin/sh -c #(nop) ADD file:6db446a57cbd2b7f4… 1.24MB
[root@server1 ~]# docker rm demo
demo
[root@server1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker run -it --rm demo:v1
/ # ls
bin etc file2 home root tmp var
dev file1 file3 proc sys usr
/ #
[root@server1 ~]# docker run -it --rm busybox
/ # ls
bin dev etc home proc root sys tmp usr var
但这样提交看不到操作记录
创建Dockerfile
我们可以用创建Dockerfile的方法构建镜像
[root@server1 ~]# mkdir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1 file2 file3
~
[root@server1 docker]# docker build -t demo:v2 .
[root@server1 docker]# docker images
[root@server1 docker]# docker history demo:v2
Dockerfile常用命令
FROM
指定base镜像,如果本地不存在会从远程仓库下载
RUN
在容器中运行命令并创建新的镜像层,常用于安装软件包
[root@server1 docker]# vim Dockerfile
FROM busybox
RUN touch file1 file2 file3
CMD echo "hello world"
[root@server1 docker]# docker build -t demo:v3 .
[root@server1 docker]# docker run --rm demo:v3
hello world
COPY
把文件从build context复制到镜像
支持两种形式:COPY src dest 和 COPY ["src", "dest"]
src必须指定build context中的文件或目录
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# echo www.westos.org > index.html
[root@server1 docker]# ls
Dockerfile index.html
[root@server1 docker]# docker build -t demo:v4 .
[root@server1 docker]# docker history demo:v4
[root@server1 docker]# docker run --rm demo:v4 cat /index.html
ADD
用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像
[root@server1 docker]# vim Dockerfile
ADD nginx-1.20.2.tar.gz /
[root@server1 docker]# docker build -t demo:v5 .
[root@server1 docker]# docker run --rm demo:v5 ls /
ENV
设置环境变量,变量可以被后续的指令使用
[root@server1 docker]# vim Dockerfile
ENV hostname server1
CMD echo $hostname
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# docker build -t demo:v6 .
[root@server1 docker]# docker run --rm demo:v6
EXPOSE
如果容器中运行应用服务,可以把服务端口暴露出去
EXPOSE 80
[root@server1 docker]# docker run -d --name demo -p 80:8080 yakexi007/mario
[root@server1 docker]# docker ps
[root@server1 docker]# docker port demo
网桥会自动分配一个ip
VOLUME
申明数据卷,通常指定的是应用的数据挂在点
VOLUME ["/data"]
[root@server1 docker]# docker build -t demo:v7 .
[root@server1 docker]# docker history demo:v7
[root@server1 docker]# docker run -it --rm demo:v7 sh
/ # ls
bin etc file3 nginx-1.20.2 sys var
data file1 home proc tmp
dev file2 index.html root usr
/ # cd data
/data # touch file
/data # ls
file
/data # rm -f file
/data # cp /index.html .
/data # ls
index.html
/data #
[root@server1 docker]# docker inspect 07167cc0ecac
[root@server1 docker]# cd /var/lib/docker/volumes/96113ea9cc0f4343d0491ea6cf4e338d8a913a37550e6205d85696cc3fddf139/_data ##容器和此目录是互通的
[root@server1 _data]# ls
index.html
[root@server1 _data]# rm -f index.html
[root@server1 _data]# cp /etc/passwd .
[root@server1 _data]# ls
passwd
[root@server1 _data]# docker attach 07167cc0ecac
/data # ls
passwd
查看信息可以查看到所关联目录
CMD 与 ENTRYPOINT
这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。
docker run后面的参数可以传递给ENTRYPOINT指令当作参数。
Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。
CMD ["/bin/echo", "$hostname"]
[root@server1 docker]# docker build -t demo:v8 .
[root@server1 docker]# docker run --rm demo:v8
$hostname
[root@server1 docker]# docker rmi demo:v8
CMD无法识别echo
修改一下
CMD ["/bin/sh","-c","echo $hostname"]
[root@server1 docker]# docker run --rm demo:v8
server1
Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。
ENTRYPOINT ["/bin/echo","hello"]
CMD ["world"]
~
[root@server1 docker]# docker build -t demo:v9 .
[root@server1 docker]# docker run --rm demo:v9
hello world
[root@server1 docker]# docker run --rm demo:v9 linux
hello linux
[root@server1 docker]# docker run --rm demo:v9 linux redhat
hello linux redhat
四、创建nginx镜像及优化
[root@server1 ~]# docker images | grep demo | awk