本文共 11580 字,大约阅读时间需要 38 分钟。
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版),我们用社区版就可以了。
docker应用场景
Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。
docker的优点
Docker 是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。1、快速,一致地交付您的应用程序Docker 允许开发人员使用您提供的应用程序或服务的本地容器在标准化环境中工作,从而简化了开发的生命周期。容器非常适合持续集成和持续交付(CI / CD)工作流程,请考虑以下示例方案:您的开发人员在本地编写代码,并使用 Docker 容器与同事共享他们的工作。他们使用 Docker 将其应用程序推送到测试环境中,并执行自动或手动测试。当开发人员发现错误时,他们可以在开发环境中对其进行修复,然后将其重新部署到测试环境中,以进行测试和验证。测试完成后,将修补程序推送给生产环境,就像将更新的镜像推送到生产环境一样简单。2、响应式部署和扩展Docker 是基于容器的平台,允许高度可移植的工作负载。Docker 容器可以在开发人员的本机上,数据中心的物理或虚拟机上,云服务上或混合环境中运行。Docker 的可移植性和轻量级的特性,还可以使您轻松地完成动态管理的工作负担,并根据业务需求指示,实时扩展或拆除应用程序和服务。3、在同一硬件上运行更多工作负载Docker 轻巧快速。它为基于虚拟机管理程序的虚拟机提供了可行、经济、高效的替代方案,因此您可以利用更多的计算能力来实现业务目标。Docker 非常适合于高密度环境以及中小型部署,而您可以用更少的资源做更多的事情。
Docker包括三个基本概念:
链接: ,
[root@server1 ~]# cd /etc/yum.repos.d/[root@server1 yum.repos.d]# vim docker.repo[docker]name=docker-cebaseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/gpgcheck=0仅用docker-ce源,去安装docker-ce的时候还存在依赖性,发现所有的依赖性都来自 centoscurl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.reposed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repovim /etc/yum.repos.d/CentOS-Base.repo:%s/$releasever/7/g
yum repolistyum install -y docker-cesystemctl enable --now dockerdocker info ## 查看docker信息 WARNING: bridge-nf-call-iptables is disabled WARNING: bridge-nf-call-ip6tables is disabledsysctl -a|grep bridge-nf-call-iptablescd /etc/sysctl.dvim docker.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1sysctl --systemip addr show
链接: .
链接: .链接: .
[root@server1 ~]# docker search yakexi007[root@server1 ~]# docker pull yakexi007/game2048[root@server1 ~]# yum install -y bash-*[root@server1 ~]# docker images[root@server1 ~]# docker run -d --name demo -p 80:80 yakexi007/game2048 [root@server1 ~]# docker ps ##查询端口连接情况 [root@server1 ~]# docker ps -a ##查看所有的,包括已经停掉的[root@server1 ~]# docker rm -f demo
[root@server1 ~]# docker search yakexi007[root@server1 ~]# docker pull yakexi007/mario[root@server1 ~]# docker images[root@server1 ~]# docker history yakexi007/mario:latest[root@server1 ~]# docker run -d --name demo -p 80:8080 yakexi007/mario[root@server1 ~]# docker ps
链接: .
链接: .拉取一个busybox作为实验环境[root@server1 ~]# docker pull busybox[root@server1 ~]# docker history busybox:latest会执行shell ,提供一个环境,交互式,进入交互式[root@server1 ~]# docker run -it busybox会提供一个ip ,在容器的ip上单调递增,内核版本信息和宿主机一模一样当我们CTRL+d 推出那个交互式环境之后,我们再次查看进程,发现已经没有进程了注意:CTRL+p+q 是打入后台,可以退出交互式环境,还可以保留进程[root@server1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe978bf7bc71f busybox "sh" 10 minutes ago Exited (0) 7 minutes ago practical_cohen[root@server1 ~]# docker start e978bf7bc71fe978bf7bc71f[root@server1 ~]# docker container attach e978bf7bc71f ##使用这个命令可以直接进入
[root@server1 ~]# docker container attach e978bf7bc71f ##附加到容器id上/ # touch file1/ # touch file2/ # touch file3[root@server1 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESe978bf7bc71f busybox "sh" 36 minutes ago Exited (0) 8 seconds ago practical_cohen[root@server1 ~]# docker rm e978bf7bc71fe978bf7bc71f[root@server1 ~]# docker run -it --rm busybox ##加--rm 是自动回收 / # ls
[root@server1 ~]# docker run -it --name demo busybox[root@server1 ~]# docker commit -m "add files" demo demo:v1[root@server1 ~]# docker images
[root@server1 ~]# docker rm demo[root@server1 ~]# docker run -it --name demo demo:v1/ # ls
链接: .
root@server1 ~]# mkdir docker[root@server1 ~]# cd docker/[root@server1 docker]# vim Dockerfile ##镜像的构建FROM busyboxRUN touch file1RUN mkdir westos[root@server1 docker]# docker build -t demo:v1 [root@server1 docker]# vim Dockerfile[root@server1 docker]# docker build -t demo:v2 FROM demo:v1RUN touch file2RUN mkdir redhat
[root@server1 docker]# vim index.htmlwww.westos.com[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /[root@server1 docker]# docker history demo:v1[root@server1 docker]# docker run -it --rm demo:v1
[root@server1 docker]# tar zcf test.tar.gz /etc[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt [root@server1 docker]# docker build -t demo:v2 .[root@server1 docker]# docker history demo:v2[root@server1 docker]# docker run -it --rm demo:v2
[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1[root@server1 docker]# docker build -t demo:v3 .
[root@server1 docker]# vim Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80[root@server1 ~]# docker run -d --name demo -P nginx-P: 随机端口映射,容器内部端口随机映射到主机的端口[root@server1 ~]# docker inspect demo
[root@server1 docker]# cat DockerfileFROM busyboxVOLUME ["/data"]这里不要直接退出,将其打入后台 CTRL+P+Q,保证进程 一直存在。
docker inspect demo
删除卷。 [root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]CMD echo "hello world"[root@server1 docker]# docker build -t demo:v5 .[root@server1 docker]# docker run --rm demo:v5
Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量[root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]CMD ["/bin/sh", "-c", "echo hello $HOSTNAME"] [root@server1 docker]# docker build -t demo:v9 .[root@server1 docker]# docker run --rm demo:v9
[root@server1 docker]# cat Dockerfile FROM busyboxRUN touch file1COPY index.html /ADD test.tar.gz /mnt ENV HOSTNAME server1EXPOSE 80VOLUME ["/data"]ENTRYPOINT ["echo hello"]CMD ["world"][root@server1 docker]# docker build -t demo:v10 .[root@server1 docker]# docker run --rm demo:v10[root@server1 docker]# docker run --rm demo:v10 linux
docker images | grep demo | awk '{print $1":"$2}' docker rmi `docker images | grep demo | awk '{print $1":"$2}'` #删除前面的容器镜像[root@server1 docker]# docker image prune ##删除没有id的镜像
官方nginx大小
[root@server1 ~]# lsdocker nginx.tar rhel7.tardocker load -i rhel7.tardocker run -it --name demo rhel7 bash[root@server1 ~]# docker cp nginx-1.18.0.tar.gz demo:/
[root@server1 ~]# docker run -it --name demo rhel7 bashbash-4.2# vi dvd.repobash-4.2# rpmdb --rebuilddbbash-4.2# yum install -y gcc pcre-develbash-4.2# mv nginx-1.18.0.tar.gz /mnt/bash-4.2# tar zxf nginx-1.18.0.tar.gz bash-4.2# ./configure bash-4.2# yum install -y zlib-develbash-4.2# make bash-4.2# make installbash-4.2# whereis nginxnginx: /usr/local/nginxbash-4.2# /usr/local/nginx/sbin/nginx -tbash-4.2# exit
测试:
[root@server1 ~]# lsdocker nginx-1.18.0.tar.gz nginx.tar rhel7.tar[root@server1 ~]# mv nginx-1.18.0.tar.gz docker/[root@server1 ~]# cd docker/[root@server1 docker]# lsDockerfile index.html nginx-1.18.0.tar.gz[root@server1 docker]# cat DockerfileFROM rhel7 COPY dvd.repo /etc/yum.repos.d/ADD nginx-1.18.0.tar.gz /mntWORKDIR /mnt/nginx-1.18.0RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make && yum clean allEXPOSE 80VOLUME ["/usr/local/nginx/html"]CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]docker build -t webserver:v1
1.选择最精简的基础镜像
2.减少镜像的层数 3.清理镜像构建的中间产物 4.注意优化网络请求 5.尽量去用构建缓存 6.使用多阶段构建镜像减少镜像层数 --296M
清理镜像构建的中间产物 --233M 使用多阶段构建镜像 --144M多阶段[root@server1 docker]# cat Dockerfile FROM rhel7 as buildCOPY dvd.repo /etc/yum.repos.d/ADD nginx-1.18.0.tar.gz /mntWORKDIR /mnt/nginx-1.18.0RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel &> /dev/null && ./configure &> /dev/null && make &> /dev/null && make install &> /dev/null && rm -fr /mnt/nginx-1.18.0 && yum remove -y gcc make && yum clean allFROM rhel7COPY --from=build /usr/local/nginx /usr/local/nginxEXPOSE 80VOLUME ["/usr/local/nginx/html"]CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
链接: .
[root@server1 ~]# docker load -i base-debian10.tar [root@server1 docker]# docker pull nginx:1.18.0[root@server1 docker]# docker images[root@server1 ~]# mkdir nginx[root@server1 ~]# vim Dockerfile[root@server1 ~]# docker build -t webserver:v4 .[root@server1 ~]# docker run -d --name webserver webserver:v4e70b3305f5b84af071beb95c1b936fb874c1ee6d53015d9187be491a1b99064b[root@server1 ~]# docker ps
[root@server1 docker]# cat Dockerfile FROM nginx:1.18.0 as base# https://en.wikipedia.org/wiki/List_of_tz_database_time_zonesARG TIME_ZONERUN mkdir -p /opt/var/cache/nginx && \ cp -a --parents /usr/lib/nginx /opt && \ cp -a --parents /usr/share/nginx /opt && \ cp -a --parents /var/log/nginx /opt && \ cp -aL --parents /var/run /opt && \ cp -a --parents /etc/nginx /opt && \ cp -a --parents /etc/passwd /opt && \ cp -a --parents /etc/group /opt && \ cp -a --parents /usr/sbin/nginx /opt && \ cp -a --parents /usr/sbin/nginx-debug /opt && \ cp -a --parents /lib/x86_64-linux-gnu/ld-* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpcre.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libz.so.* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libc* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libdl* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libpthread* /opt && \ cp -a --parents /lib/x86_64-linux-gnu/libcrypt* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libssl.so.* /opt && \ cp -a --parents /usr/lib/x86_64-linux-gnu/libcrypto.so.* /opt && \ cp /usr/share/zoneinfo/${TIME_ZONE:-ROC} /opt/etc/localtimeFROM gcr.io/distroless/base-debian10 COPY --from=base /opt /EXPOSE 80 443ENTRYPOINT ["nginx", "-g", "daemon off;"]
转载地址:http://hnhzi.baihongyu.com/