自学内容网 自学内容网

Docker部署及基本操作

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 all

FROM 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/localtime

FROM 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
#测试


原文地址:https://blog.csdn.net/mlh521love/article/details/142353561

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!