赞
踩
官网链接:点击这里部署docker仓库
[root@server1 ~]# cd /etc/yum.repos.d/
[root@server1 yum.repos.d]# vim docker.repo
[root@server1 yum.repos.d]# cat docker.repo
[docker]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable
gpgcheck=0
[root@server1 yum.repos.d]# yum install -y docker-ce
安装时出现较为复杂的依赖性,所以需要下载centos仓库:
centos仓库部署
不同版本的可以进入aliyun镜像站下载。
[root@server1 yum.repos.d]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@server1 yum.repos.d]# ls
CentOS-Base.repo docker.repo dvd.repo redhat.repo
[root@server1 yum.repos.d]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@server1 yum.repos.d]# vim CentOS-Base.repo #实验所用redhat企业版需要更改yum源,做如下更改。
:%s/$releasever/7/g
[root@server1 yum.repos.d]# yum install -y docker-ce #再次下载解决了依赖性

[root@server1 ~]# systemctl start docker.service [root@server1 ~]# systemctl enable docker.service Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service. [root@server1 ~]# docker info #查看仓库信息 远程下载镜像: [root@server1 ~]# docker search yakexi007 NAME DESCRIPTION STARS OFFICIAL AUTOMATED yakexi007/game2048 0 yakexi007/mario 0 yakexi007/nginx 0 [root@server1 ~]# docker pull yakexi007/game2048 [root@server1 ~]# docker run -d --name demo -p 80:80 yakexi007/game2048 #加了地址映射后即可访问172.25.4.1玩游戏嘻嘻嘻. 因为下载速度慢,没有实际演示。 [root@server1 ~]# docker ps [root@server1 ~]# docker rm -f demo 本地下载镜像: [root@server1 ~]# docker load -i mario.tar [root@server1 ~]# docker images [root@server1 ~]# docker run -d --name demo -p 80:8080 mario [root@server1 ~]# docker ps
测试:

登陆阿里云进入控制台,安步骤操作:



[root@server1 ~]# cd /etc/docker/
[root@server1 docker]# ls
key.json
[root@server1 docker]# vim daemon.json
[root@server1 docker]# cat daemon.json
{
"registry-mirrors": ["https://u8pcii6z.mirror.aliyuncs.com"]
}
[root@server1 docker]# systemctl daemon-reload
[root@server1 docker]# systemctl restart docker
| 命令 | 功能 |
|---|---|
| docker search nginx | 查询nginx |
| docker pull nginx | 拉取镜像 |
| docker history nginx | 查看nginx包含的镜像层 |
| docker images | 查看系统中所有的镜像 |
| docker ps | 查看正在运行的进程, -a 参数是显示所有的进程 |
| docker rmi 镜像名称 | 删除指定镜像 |
| docker rm 容器 | 删除指定的容器 |
| docker commit | 命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像 |
| docker load -i rhel7.tar | 用load可以加载本地的镜像 |
| docker inspect 容器名称 | 查看指定容器的详细信息 |
| docker history 镜像名称 | 查看指定镜像构造容器所经历的镜像层 |
| ctrl + p +q | 将该进程打入后台 |
直接创建
[root@server1 docker]# docker pull busybox
[root@server1 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 10 days ago 1.23MB
[root@server1 docker]# docker run -it --name test busybox
/ # echo helloworld > testfile
[root@server1 docker]# docker commit test test:v1
sha256:518ca9c2375bf08eef3a4d8cb98a9e6b4d21d8e15bb006a1ca98e229d3c89fac
[root@server1 docker]# docker images test:v1
REPOSITORY TAG IMAGE ID CREATED SIZE
test v1 518ca9c2375b 6 seconds ago 1.23MB
Dockerfile建立镜像
[root@server1 ~]# mkdir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN echo helloworld > testfile
[root@server1 docker]# docker build -t demo:v1 .
[root@server1 docker]# docker images

[root@server1 docker]# docker history demo:v1 #查看镜像分层结构

镜像的缓存特性
[root@server1 docker]# vim file2
[root@server1 docker]# ls
Dockerfile file2
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN echo helloworld > testfile
COPY file2 /
[root@server1 docker]# docker build -t demo:v2 .

| 命令 | 功能 |
|---|---|
| FROM | 指定base镜像,如果本地不存在会从远程仓库下载 |
| MAINTAINER | 设置镜像的作者,比如用户邮箱等 |
| COPY | 把文件从build context复制到镜像支持两种形式:COPY src dest 和 COPY [“src”, “dest”],src必须指定build context中的文件或目录 |
| ADD | 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像, 例:ADD html.tar /var/www ;ADD http://ip/html.tar /var/www |
| ENV | 设置环境变量,变量可以被后续的指令使用:ENV HOSTNAME sevrer1.example.com |
| EXPOSE | 如果容器中运行应用服务,可以把服务端口暴露出去:EXPOSE 80 |
| VOLUME | 申明数据卷,通常指定的是应用的数据挂在点:VOLUME ["/var/www/html"] |
| WORKDIR | 为RUN、CMD、ENTRYPOINT、ADD和COPY指令设置镜像中的当前工作目录,如果目录不存在会自动创建 |
| RUN | 在容器中运行命令并创建新的镜像层,常用于安装软件包:RUN yum install -y vim |
| CMD 与 ENTRYPOINT | 这两个指令都是用于设置容器启动后执行的命令,但CMD会被docker run后面的命令行覆盖,而ENTRYPOINT不会被忽略,一定会被执行。docker run后面的参数可以传递给ENTRYPOINT指令当作参数。Dockerfile中只能指定一个ENTRYPOINT,如果指定了很多,只有最后一个有效。 |
RUN、COPY:
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
[root@server1 docker]# vim index.html
[root@server1 docker]# docker build -t demo:v1 .
[root@server1 docker]# docker run -it --rm demo:v1

ADD
[root@server1 docker]# tar zcf test.tar.gz /etc
tar: Removing leading `/' from member names
[root@server1 docker]# ls
Dockerfile index.html test.tar.gz
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
[root@server1 docker]# docker build -t demo:v2 .
[root@server1 docker]# docker run -it --rm demo:v2

ENV
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
[root@server1 docker]# docker build -t demo:v3 .
[root@server1 docker]# docker run -it --rm demo:v3

EXPOSE:暴露容器内的应用端口(需要应用型镜像,比如nginx)
[root@server1 docker]# docker pull nginx #需要做上文的镜像加速,否则速度会很慢
[root@server1 docker]# docker images

[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
[root@server1 docker]# docker run -d --name demo -P nginx
aff8f3b00d28a0b47ee8516699da760589cb4c82c389002ac1d357e0509c297a
[root@server1 docker]# docker inspect demo #查看容器的全部信息




VOLUME
[root@server1 docker]# vim Dockerfile
[root@server1 docker]# cat Dockerfile
FROM busybox
RUN touch file1
COPY index.html /
ADD test.tar.gz /mnt
ENV HOSTNAME server1
EXPOSE 80
VOLUME ["/data"]
[root@server1 docker]# docker build -t demo:v5 .
[root@server1 docker]# docker run -it --name demo demo:v5 # 此处不要--rm参数,数据要保留
/ # cd /data
/data # touch docker1 #用ctrl+q+p挂起,不要退出容器
[root@server1 docker]# docker inspect demo

[root@server1 docker]# cd /var/lib/docker/volumes/cb33667630db3b2dca941de7b386b9235351cb028ea9e15cd4fa8a44404301d3/_data
[root@server1 _data]# ls
docker1
[root@server1 _data]# touch docker2
[root@server1 _data]# docker attach demo
/data # ls
docker1 docker2
/data #
[root@server1 _data]# docker rm demo
demo
[root@server1 _data]# docker volume ls # 查看卷
[root@server1 _data]# docker volume prune # 删除没有被占用的卷
[root@server1 _data]# docker volume ls


CMD和ENTRYPOINT
两者都指镜像运行时执行的命令,CMD会被覆盖,ENTRYPOINT不会被覆盖。

格式问题:
[root@server1 docker]# vim Dockerfile [root@server1 docker]# cat Dockerfile FROM busybox RUN touch file1 COPY index.html / ADD test.tar.gz /mnt ENV HOSTNAME server1 EXPOSE 80 VOLUME ["/data"] CMD echo "$HOSTNAME" [root@server1 docker]# docker build -t demo:v6 . [root@server1 docker]# docker run --rm demo:v6 server1 Shell格式底层会调用/bin/sh -c来执行命令,可以解析变量,而下面的exec格式不会 [root@server1 docker]# vim Dockerfile [root@server1 docker]# cat Dockerfile FROM busybox RUN touch file1 COPY index.html / ADD test.tar.gz /mnt ENV HOSTNAME server1 EXPOSE 80 VOLUME ["/data"] CMD ["echo", "$HOSTNAME"] [root@server1 docker]# docker build -t demo:v7 . [root@server1 docker]# docker run --rm demo:v7 $HOSTNAME 改写成以下形式即可解析: CMD ["/bin/sh", "-c", "echo $HOSTNAME"]
覆盖问题:
[root@server1 docker]# vim Dockerfile [root@server1 docker]# cat Dockerfile FROM busybox RUN touch file1 COPY index.html / ADD test.tar.gz /mnt ENV HOSTNAME server1 EXPOSE 80 VOLUME ["/data"] ENTRYPOINT ["echo", "hello"] CMD ["world"] [root@server1 docker]# docker build -t demo:v8 . [root@server1 docker]# docker run --rm demo:v8 hello world [root@server1 docker]# docker run --rm demo:v8 linux #docker run提供的参数只覆盖了CMD命令的输出‘world’ hello linux [root@server1 docker]# docker run --rm demo:v8 redhat hello redhat
注:Exec格式时,ENTRYPOINT可以通过CMD提供额外参数,CMD的额外参数可以在容器启动时动态替换。在shell格式时ENTRYPOINT会忽略任何CMD或docker run提供的参数。
ENTRYPOINT echo "hello"
CMD "world"
将Dockerfile中输出内容替换为shell格式
ENTRYPOINT将会忽略一切额外参数:

本次实验没有用base基础包,用的是rhel7,做一个nginx镜像:
[root@server1 docker]# cat Dockerfile
FROM rhel7 as build
COPY dvd.repo /etc/yum.repos.d/
ADD nginx-1.18.0.tar.gz /mnt
WORKDIR /mnt/nginx-1.18.0
RUN 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 all # 此处为减少镜像层数将命令用&&连接,清理了gcc、make、/mnt/nginx-1.18.0这些中间产物
FROM rhel7 #使用了多阶段构建
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;"]
又使用了base包(下载地址),需要导入 :base-debian10
[root@server1 docker]# vim Dockerfile [root@server1 docker]# cat Dockerfile FROM nginx:1.18.0 as base # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones 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 /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/localtime FROM gcr.io/distroless/base-debian10 COPY --from=base /opt / EXPOSE 80 443 ENTRYPOINT ["nginx", "-g", "daemon off;"]

手动编写的nginx镜像大小为144M,因为rhel7基础镜像大小为140M,base建立的镜像大约为31.7M。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。