Docker
-
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
-
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
-
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
Docker的安装
- 修改镜像源仓库,指向阿里镜像源(确保虚拟机能够上网)
[rhel7.6]
name=rhel7.6
baseurl=http://172.25.3.250/rhel7.6
gpgcheck=0
[docker-ce]
name=docker-ce
baseurl=https://mirrors.aliyun.com/docker-ce/linux/centos/7/x86_64/stable/
gpgcheck=0
enabled=1
需要解决依赖性: container-selinux-2.77-1.el7.noarch.rpm提取码: etqw
yum install docker-ce container-selinux-2.77-1.el7.noarch.rpm -y
下载安装,并开启服务 systemctl enable --now docker.service
,
docker info 查看docker的详细信息
- 生成一个配置文件
vim /etc/sysctl.d/docker.conf
[root@server3 ~]# cat /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
- 添加docker 镜像加速器 ,使拉取镜像的速度变快,添加之后要重启服务
[root@server3 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://ysuglhfo.mirror.aliyuncs.com"]
}
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>
将该进程打入后台
docker run 命令的常用参数
参数 | 作用 |
---|---|
-d | 后台运行 |
-it | 分配一个终端 |
--rm | 多用于busybox镜像,当退出busybox时,就自动删除该docker 进程 |
--name | 对调用该镜像形成的进程起一个别名,如果不加该参数系统会自动生成一个别名 |
-v | 用于做容器和宿主机的数据目录挂载,“ : ” 之前的是宿主机的目录或者是数据卷,“:” 之后的是容器内的目录路径(可以是文件) |
-p | 端口映射,外网主机可以通过宿主机的端口,来访问容器里的内容 |
常用命令可以访问 docker常用命令
Docker的常用使用方法
Docker 拉取
docker search nginx
查询有关nginx的镜像
docker pull nginx
拉取nginx镜像
docker images
显示系统中所有的镜像
docker history nginx
查看nginx包含的镜像层
- 调用镜像并运行
加了端口映射之后,外网可以通过访问宿主机的端口来获取容器内的内容
连接到指定容器
当前运行的两个容器
连接的两种方式
Docker 加载本地镜像和生成本地镜像的tar包
-
生成本地镜像的tar包,适合宿主机没有网络用
-
从本地的tar 包加载镜像
生成镜像
docker commit 生成
docker commit命令将容器的可读写层转换为一个只读层,这样就把一个容器转换成了不可变的镜像。
- 打开一个容器
- 生成一个镜像
docker file方法生成镜像
Dockerfile常用指令
指令 | 作用 |
---|---|
FROM | 指定base镜像,如果本地不存在会从远程仓库下载 |
MAINTAINER | 设置镜像的作者,比如用户邮箱等 |
COPY | 把文件从build context复制到镜像,支持两种形式:COPY src dest 和 COPY [“src”, “dest”], src文件是在执行docker build -t 命令当前目录的文件或者目录 |
ADD | 用法与COPY类似,不同的是src可以是归档压缩文件,文件会被自动解压到dest,也可以自动下载URL并拷贝到镜像: |
ENV | 设置环境变量,变量可以被后续的指令使用: |
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不会被忽略,一定会被执行。 |
实现nginx服务镜像的步骤
rhel7基础镜像:rhel7基础镜像 提取码: 8wku
nginx 1.19.4源码包:nginx1.19.4提取码: mic2
实现步骤:
- 将rhel7.tar 导入到本地镜像中
docker load -i rhel7.tar
- 建立一个目录daemon,该目录下放有nginx源码包和yum仓库配置文件,并创建一个Dockerfile文件,文件的内容如下
[root@server3 daemom]# cat westos.repo
[rhel7.6]
name=rhel7.6
baseurl=http://172.25.3.250/rhel7.6
gpgcheck=0
Dockerfile文件
[root@server3 daemom]# cat Dockerfile
FROM rhel7
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.19.4.tar.gz /mnt/
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
WORKDIR /mnt/nginx-1.19.4/
RUN rpmdb --rebuilddb
RUN yum install -y gcc make pcre-devel zlib-devel
RUN ./configure --prefix=/usr/local/nginx
RUN make
RUN make install
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -t demo:v3 .
生成镜像文件
docker history demo:v3
查看该镜像在运行时,经历过的镜像层
通过生成的镜像文件生成容器
docker run -d -it --name demo1 -p 80:80 -v webdata:/usr/local/nginx/html demo:v3
注: 如果不加-v 参数,则会自动的在宿主机的/var/lib/docker/volumes生成一个目录,并将挂载到容器里的 数据卷上.
docker inspect demo1
查看该容器的详细信息,
创建测试页并测试:
镜像的优化
优化方法
- 选择最精简的基础镜像
- 减少镜像的层数
- 清理镜像构建的中间产物
- 注意优化网络请求
- 尽量去用构建缓存
- 使用多阶段构建镜像
优化后的Dockerfile
- 没有采用base基础包,使用rhel7
[root@server3 daemom]# cat Dockerfile
FROM rhel7 as build
COPY westos.repo /etc/yum.repos.d/
ADD nginx-1.19.4.tar.gz /mnt
WORKDIR /mnt/nginx-1.19.4
RUN rpmdb --rebuilddb && yum install -y gcc make pcre-devel zlib-devel && sed -i 's/CFLS="$CFLAGS -g"/#CFLAGS ="$CFLAGS -g"/g' auto/cc/gcc && ./configure --prefix=/usr/local/nginx && make && make install && rm -fr /var/cache/* && rm -fr /mnt/nginx-1.19.4
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包
[root@server3 test]# cat Dockerfile
FROM nginx:latest as base
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
ENTRYPOINT ["nginx", "-g", "daemon off;"]
差距: