Docker镜像

本文详细介绍了Docker镜像的下载、安装、分层结构及构建,强调了Dockerfile的使用和镜像优化。此外,还探讨了私有仓库的建立、镜像加速器配置、企业级仓库Harbor的构建,以及Docker网络配置。在安全方面,讨论了容器资源控制、安全加固策略和Docker安全工具。最后,简述了Docker Machine、Docker Compose和Docker Swarm在集群管理中的作用。
摘要由CSDN通过智能技术生成

目录

一、Docker镜像下载与安装

二、 镜像的分层结构

三、 镜像的构建

docker commit

创建Dockerfile

Dockerfile常用命令

FROM

RUN

COPY

ADD

ENV

EXPOSE

VOLUME

CMD 与 ENTRYPOINT

四、创建nginx镜像及优化

封装镜像

镜像的优化

减少镜像的层数

使用多阶段构建镜像

选择最精简的基础镜像

五、建立私有仓库

六、配置镜像加速器

阿里云加速器

官方加速器

七、构建企业级仓库harbor

八、Docker 原生网络

bridge

host

none

九、Docker 自定义网络

十、Docker容器通信

--network

容器访问外网

外网访问容器

十一、跨主机容器网络

macvlan网络方案实现

十二、Docker数据卷

bind mount

docker managed volume

卷插件

convoy

十三、Docker安全

Docker安全简介

容器资源控制

CPU限额

Block IO限制

十四、Docker安全加固

LXCFS

设置特权级运行的容器: --privileged=true

设置容器白名单: --cap-add

安全加固的思路

保证镜像的安全

保证容器的安全

Docker安全的顶尖开源工具

十五、Docker Machine

十六、Docker Compose

Docker Compose简介

Docker Compose实践

十七、Docker Swarm


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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值