docker容器(1)
- 1.什么是docker容器
- 2.建立软件仓库
- 3.发布一个小游戏
- 4.镜像的构建
- 4.1 方法一
- 4.2 方法二
- 5.Dockerfile详解
- 6.镜像优化
1.什么是docker容器
Docker 容器是一个开源的应用容器引擎,让开发者可以以统一的方式打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何安装了docker引擎的服务器上(包括流行的Linux机器、windows机器),也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。
2.建立软件仓库
- cd /etc/yum.repo/docker.repo
[docker]
name=docker
baseurl=http://172.25.33.250/docker-ce
gpgcheck=0
3.发布一个小游戏
yum install -y docker-ce # 安装docker
systemctl enable --now docker # 启动docker
查看docker状态:
docker info
docker默认使用网桥连接,若无WARNING报错。则不用编写文件(下图所示):
docker info
若有WARNING报错,则需要编写文件:
[root@server9 yum.repos.d]# cd /etc/sysctl.d
[root@server9 sysctl.d]# ls
99-sysctl.conf
[root@server9 sysctl.d]# vim docker.conf
[root@server9 sysctl.d]# vim docker.conf
[root@server9 sysctl.d]# cat docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
[root@server9 sysctl.d]#
docker load -i mario.tar
docker run -d --name demo -p 80:8080 mario
在网页输入本机ip:
发布成功
删除:docker rm -f demo
4.镜像的构建
4.1 方法一
docker commit 构建新镜像三步:
运行容器、修改容器、将容器保存为新的镜像
缺点:
效率低、可重复性弱、容易出错
使用者无法对镜像进行审计,存在安全隐患
运行容器
- docker run -it --name test busybox
修改容器 (以下命令在容器内运行) - echo helloworld > testfile
将容器保存为新的镜像 - docker commit test test:v1
查看镜像 - docker images test:v1
此方法无法审计新建层内容
4.2 方法二
创建一个Dockerfile,编写Dockerfile文件
[root@server9 ~]# mkdir docker
[root@server9 ~]# cd docker/
[root@server9 docker]# ls
[root@server9 docker]# vim Dockerfile
[root@server9 docker]# cat Dockerfile
FROM busybox
RUN echo westos > testfile
构建镜像
- docker build -t demot:v1 .
[root@server9 docker]# docker build -t demot:v1 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM busybox
---> 59788edf1f3e
Step 2/2 : RUN echo westos > testfile
---> Running in 9b12ba4533ce
Removing intermediate container 9b12ba4533ce
---> 4d2832be98fb
Successfully built 4d2832be98fb
Successfully tagged demot:v1
- docker images # 查看信息
- 查看镜像的分层结构:
- docker history demot:v1 # 查看镜像的分层结构
[root@server9 docker]# docker history demot:v1
IMAGE CREATED CREATED BY SIZE COMMENT
4d2832be98fb About a minute ago /bin/sh -c echo westos > testfile 7B
59788edf1f3e 2 years ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:63eebd629a5f7558c… 1.15MB
[root@server9 docker]# docker history busybox.tar
Error response from daemon: No such image: busybox.tar:latest
[root@server9 docker]# docker history busybox
IMAGE CREATED CREATED BY SIZE COMMENT
59788edf1f3e 2 years ago /bin/sh -c #(nop) CMD ["sh"] 0B
<missing> 2 years ago /bin/sh -c #(nop) ADD file:63eebd629a5f7558c… 1.15MB
5.Dockerfile详解
例:安装nginx镜像至rhel7 base中
- docker load -i rhel7.tar # 将rhel7导入本机docker
建立一个docker目录
docker目录中,需要有软件仓库,ngnix安装包,及创建一个Dockerfile
[root@server9 ~]# mkdir docker
[root@server9 ~]# cd docker/
[root@server9 docker]# ls
[root@server9 docker]# vim Dockerfile
Dockerfile文件内容:
FROM rhel7 # FROM,指定base镜像,如果本地不存在会从远程仓库下载
EXPOSE 80 # EXPOSE,如果容器中运行应用服务,可以把服务端口暴露出去
VOLUME ["/usr/local/nginx/html"] # VOLUME申明数据卷,通常指定的是应用的数据挂在点:VOLUME ["/var/www/html"]
COPY dvd.repo /etc/yum.repos.d/ # COPY,把文件从build context复制到镜像
ADD nginx-1.20.1.tar.gz /mnt # 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像
RUN rpmdb --rebuilddb
RUN yum install -y gcc pcre-devel zlib-devel make
WORKDIR /mnt/nginx-1.20.1 # 为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建。
RUN ./configure &> /dev/null
RUN make install &> /dev/null
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"] # 容器启动后执行的命令
- docker build -t rhel7:v1 . #用Dockerfile构建镜像
- docker run -d --name demoht rhel7:v1#启动运行
- docker ps # 查看进程
- docker inspect demoht #查看运行的详细信息
- curl 172.17.0.3
6.镜像优化
选择最精简的基础镜像
减少镜像的层数
清理镜像构建的中间产物
注意优化网络请求
尽量去用构建缓存
使用多阶段构建镜像
- 修改Dockerfile文件内容
- docker build -t rhel7:v2 . #用Dockerfile构建镜像
- docker image rhel7 # 查看信息