Docker是一个开源的平台 ,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离,但可以通过特定的通道相互传递信息。Docker提供了一个轻量级的虚拟化解决方案。由于运行在同一计算机上的所有容器共享同一个操作系统内核,避免了启动与维护虚拟机的开销。因此相比于传统的虚拟机,Docker容器更加轻便、快速、容易部署。使用Docker,开发者可以避免在两台计算机上运行效果不一致的问题,容器提供了一致的行为,进而使得应用程序在不同环境的计算机上有相同的运行效果。
一、Docker安装部署
1、软件仓库配置
[root@docker-node1 yum.repos.d]# vim docker-ce.repo
[docker]
name=docker
baseurl=https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
########################################
[docker]
name=docker
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/9/x86_64/stable/
gpgcheck=0[root@docker-node1 ~]# dnf makecache
2、docker安装
[root@docker-node1 ~]# yum install docker-ce.x86_64 -y
[root@docker-node1 ~]# systemctl enable --now docker
二、Docker镜像管理
[root@docker-node1 ~]# docker search nginx #镜像搜索
alpine 版本:nginx镜像的最小安装发型版本[root@docker-node1 ~]# docker pull nginx:1.26-alpine #镜像拉取[root@docker-node1 ~]# docker load -i nginx:1.26-alpine.tar.gz
#导入本地镜像[root@docker-node1 ~]# docker images
#查看本地镜像[root@docker-node1 ~]# docker image inspect nginx:latest
#查看镜像信息[root@docker-node1 ~]# docker history nginx:1.26-alpine
#查看镜像结构[root@docker-node1 ~]# docker save -o nginx:1.26-alpine.tar.gz nginx:1.26-alpine
#导出镜像,一个包可以包含多个镜像
[root@docker-node1 ~]# docker save `docker images | awk 'NR>1{print $1":"$2}'` -o images.tar.gz
#保存所有镜像[root@docker-node1 ~]# docker rmi nginx:1.26-alpine
#删除镜像[root@docker-node1 ~]# docker rmi `docker images | awk 'NR>1{print $1":"$2}'`
#删除所有镜像
三、Docker容器管理
[root@docker-node1 ~]# docker run --rm --name web1 nginx
#停止容器后删除容器
#进入到容器中,按<ctrl>+<d>退出并停止容器,不会有容器进程可以使用docker -rm删除停止的容器,#按<ctrl>+<pq>退出但不停止容器,会有进程可以使用docker -rm -f删除运行中的容器[root@docker-node1 ~]# docker run -d --name web1 nginx
4f6e766f02fa52ad851775e8b52f0c318b9aec6456dc39e5dbcb6183c8475990
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4f6e766f02fa nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp web1
#后台运行[root@docker-node1 ~]# docker run -it --name web --network none busybox
#指定网络-d #后台运行
-i #交互式运行
-t #打开一个终端
--name #指定容器名称
-p #端口映射 -p 80:8080 把容器8080端口映射到本机80端口
--rm #容器停止自动删除容器
--network #指定容器使用的网络[root@docker-node1 ~]# docker ps #查看当前运行容器
[root@docker-node1 ~]# docker ps -a #查看所有容器
[root@docker-node1 ~]# docker inspect busybox #查看容器运行的详细信息[root@docker-node1 ~]# docker stop busybox #停止容器
[root@docker-node1 ~]# docker kill busybox #杀死容器,可以使用信号
[root@docker-node1 ~]# docker start busybox #开启停止的容器[root@docker-node1 ~]# docker rm centos7 #删除停止的容器
[root@docker-node1 ~]# docker rm -f busybox #删除运行的容器
[root@docker-node1 ~]# docker container prune -f #删除所有停止的容器#重新进入容器
[root@docker-node1 ~]# docker attach centos7[root@docker-node1 ~]docker run -it --name test busybox
[root@docker-node1 ~]docker rm test
#在容器中创建文件,删除容器后文件消失[root@docker-node1 docker]# docker run -it --name aaa busybox
/ # touch file
/ # ls
bin dev etc file home lib lib64 proc root sys tmp usr var
#ctrl+pq
[root@docker-node1 dockedocker commit -m "add file" aaa busybox:v1
[root@docker-node1 docker]# docker rm -f aaa
[root@docker-node1 docker]# docker run -it --name aaa busybox:v1
/ # ls
bin dev etc file home lib lib64 proc root sys tmp usr var
#提交内容永久保存[root@docker-node1 ~]# docker cp test:/file /mnt/
#把容器文件复制到本机[root@docker-node1 ~]# docker cp /etc/passwd test:/
#把本机文件复制到容器[root@docker-node1 ~]# docker logs test
# 查询容器内部日志[root@docker-node1 ~]# docker run -d --name test nginx
[root@docker-node1 ~]# docker attach test
#重新进入容器
[root@docker-node1 ~]# docker start test
[root@docker-node1 ~]# docker exec -it test bash
#在容器中执行命令
四、Docker镜像构建
1、镜像构建常用参数
#FROM COPY 和MAINTAINER
[root@docker-node1 ~]# mkdir docker/
[root@docker-node1 ~]# cd docker/
[root@docker-node1 docker]# touch leefile
[root@docker-node1 docker]# vim Dockerfile
FROM busybox:latest #指定使用的基础镜像
MAINTAINER lee@timinglee.org #指定作者信息
COPY leefile / #复制当前目录文件到容器指定位置,leefile必须在当前目录中
[root@docker-node1 docker]# docker build -t example:v1 . #构建镜像
#ADD
[root@docker-node1 docker]# touch leefile{1..3}
[root@docker-node1 docker]# tar zcf leefile.gz leefile*
[root@docker-node1 docker]# vim Dockerfile
FROM busybox
MAINTAINER lee@timinglee.org
COPY leefile /
ADD leefile.gz /
[root@docker-node1 docker]# docker build -t example:v2 .
[root@docker-node1 docker]# docker run -it --rm --name test example:v2
/ # ls
bin etc leefile leefile2 lib proc sys usr
dev home leefile1 leefile3 lib64 root tmp var
#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@docker-node1 docker]# docker run -it --rm --name test example:v3
lee
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
CMD ["/bin/echo", "$NAME"]
#CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@docker-node1 docker]# docker run -it --rm --name test example:v3
$NAME
#ENV CMD
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
#CMD echo $NAME
#CMD ["/bin/echo", "$NAME"]
CMD ["/bin/sh", "-c", "/bin/echo $NAME"]
[root@docker-node1 docker]# docker run -it --rm --name test example:v3
lee
#ENTRYPOINT
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
ENTRYPOINT echo $NAME
[root@docker-node1 docker]# docker run -it --rm --name test example:v3 sh
lee
#EXPOSE VOLUME VOLUME
FROM busybox
MAINTAINER lee@timinglee.org
ENV NAME lee
EXPOSE 80 443
VOLUME /var/www/html
WORKDIR /var/www/html
RUN touch leefile
[root@docker-node1 docker]# docker build -t example:v4 .
[root@docker-node1 docker]# docker run -it --rm --name test example:v4
/var/www/html #
2、docker镜像构建
基于红帽7系统构建nginx镜像
[root@docker-node1 ~]# docker rmi `docker images | awk '/none/{print $3}'`
[root@docker-node1 ~]# docker rmi busybox:v{1..5}
#删除多余容器
[root@docker-node1 ~]# docker load -i /mnt/centos-7.tar.gz
#导入镜像
[root@docker-node1 docker]# vim Dockerfile
FROM centos:7
LABEL Mail=leo@leoma.org
ADD nginx-1.26.1.tar.gz /
WORKDIR /nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y
RUN ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"][root@docker-node1 docker]# mv /root/nginx-1.26.1.tar.gz . #确保文件在/etc/docker目录中
[root@docker-node1 ~]# dnf install httpd -y
[root@docker-node1 ~]# vim /etc/httpd/conf/httpd.con
Listen 8888
[root@docker-node1 ~]# systemctl start httpd[root@docker-node1 ~]# mkdir /var/www/html/rhel7.9
[root@docker-node1 ~]# mount /dev/sr1 /var/www/html/rhel7.9/[root@docker-node1 ~]# docker run -it --name centos centos:7
[root@71f26db211dc yum.repos.d]# vi centos7.repo
[centos7]
name=centos7
baseurl=http://172.17.0.1:8888/rhel7.9
gpgcheck=0
[root@77d42e14da27 yum.repos.d]# exit
exit
[root@docker-node1 ~]# docker rm centos
[root@docker-node1 ~]# docker commit -m "add repo" centos centos:repo
[root@docker-node1 docker]# docker build -t nginx:v1
3、镜像构建优化
-
选择最精简的基础镜像
-
减少镜像的层数
-
清理镜像构建的中间产物
-
选择最精简的基础镜像
-
减少镜像的层数
缩减镜像层
[root@docker-node1 docker]# vim Dockerfile
FROM centos:repo
LABEL Mail=leo@leoma.org
ADD nginx-1.26.1.tar.gz /
WORKDIR /nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -fr /nginx-1.26.1 && yum clean all
EXPOSE 80 443
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
#缩减RUN层
多阶段构建
[root@docker-node1 docker]# vim Dockerfile
FROM centos:repo AS build
ADD nginx-1.26.1.tar.gz /
WORKDIR /nginx-1.26.1
RUN yum install gcc make pcre-devel openssl-devel -y && ./configure --prefix=/usr/local/nginx --with-http_ssl_module --with-http_stub_status_module && make && make install && rm -fr /nginx-1.26.1 && yum clean allFROM centos:repo
LABEL Mail=leo@leoma.org
COPY --from=build /usr/local/nginx /usr/local/nginx
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
最精简镜像构建
[root@docker-node1 docker]# vim Dockerfile
FROM nginx:1.23 AS base
ARG TIME_ZONE
RUN 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 /usr/lib/x86_64-linux-gnu/libpcre* /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-debian11
COPY --from=base /opt /
EXPOSE 80 443
ENTRYPOINT ["nginx","-g","daemon off;"][root@docker-node1 ~]# docker run --rm -d --name webserver nginx:v3
e08c99379278c8dbd5417859601ac18c7ad5d78550499c2649fd946d75fae013
[root@docker-node1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e08c99379278 nginx:v3 "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 80/tcp, 443/tcp webserver
#测试