Docker技术相关学习二
一、Docker简介
1.Docker之父Solomon Hykes形容docker就像传统的货运集装箱。
2.docker的特点和优势:
轻量级虚拟化:Docker容器相较于传统的虚拟机更加的轻量和高效,能够快速的启动和停止来节省系统资源。
一致性:确保应用程序在不同的环境中具有一致的运行表现
可移植性:可以轻松的将docker从一个平台迁移到另一个平台,无需考虑依赖和环境配置的差异
最高的资源利用:多个docker可以共享主机的操作系统内核从而可以更有效的利用系统资源。
易于部署和扩展:能够快速部署新的应用实例,也可以轻松的进行水平扩展
3.docker在企业中的应用场景:
4.docker的优势:
对于开发人员:build once and run anywhere
对于运维人员:configure once and run anything
二、部署docker
1.容器工作方法:
2.安装docker-ce并启动服务:
yum install docker-ce -y
编辑docker 启动文件,设定其使用iptables的网络设定方式,默认使用nftables
vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
--iptables=true
启动docker:systemctl enable docker --now
在rhel7中需要修改以下配置信息,其目的是将桥接网口的流量交给iptables处理,使用iptables的规则进行流量过滤以及启用网络数据的转发功能,即可以将一个网口的数据包转发到另外一个接口上
vim /etc/sysctl.d/docker.conf
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward = 1
三、Docker的基本操作
1.dcoker 镜像管理:
搜索镜像:docker search nginx
拉取镜像:docker pull busybox
查看本地镜像:docker iamges
查看镜像信息:docker image inspect nginx:1.26
保存镜像:docker image save nginx:latest -o nginx-latest.tar.gz
删除镜像:docker rmi nginx:latest
2.容器的常用操作:
启动容器:docker run -d --name mario -p 80:8080 xiao/mario
docker run -it --name centos7 centos:7
进入容器中,按ctrl+d退出并停止容器,按ctrl+pq退出但不停止容器,其中-d参数表示容器在后台运行当前终端会立即返回且容器的输出不会显示在终端,宿主机的80端口会映射到容器的8080端口,可以通过浏览器访问 http://localhost来访问,会将该请求转发到容器内的web应用。其中 -i参数表示以交互模式运行容器(使容器的标准输入保持打开状态),-t参数表示为其分配一个伪终端,即可以在容器内使用命令行工具。
重新进入容器:docker attach centos7
在容器中执行命令:docker exec -it test ifconfig
查看当前运行容器:docker ps
查看所有容器:docker ps -a
查看容器运行的详细信息:docker inspect busybox
停止容器:docker stop busybox
杀死容器:docker kill busybox
开始停止的容器:docker start busybox
容器内的第一个进程必须一直处于运行状态否则这个容器会处于退出状态
删除停止的容器:docker rm centos7
删除运行的容器:docker rm -f busybox
删除所有停止的容器:docker container prue -f
3.容器内提交:
docker run -it --name test busybox
touch testfile
#删除容器
docker rm test
#删除容器后开启新的容器文件
docker run -it --name test busybox
通过上述示例可以看到容器内刚开始创建的文件已经不存在,当需要在再次打开容器时仍然可以看到之前创建过的文件,可以执行容器内内容提交的命令来永久保存
#容器内内容提交命令
docker commit -m "add testfile" test busybox:v1
#查看本地镜像的提交动作
docker image history busybox:v1
4.系统中文件和容器中的文件传输
#把容器中文件复制到本机
docker cp test2:/testfile /mnt
#把本机文件复制到容器中
docker cp /etc/fstab test2:/fstab
5.查询容器内部日志:docker logs web
四、docker 镜像构建
1.docker 镜像结构:
共享宿主机的kernel
采用分层结构最大的好处是共享资源
2.镜像运行的基本原理:
copy-on-write可写容器层,容器以下所有镜像层都是只读的,docker从上往下依次查找文件,容器层保存镜像变化的部分,并不会对镜像本身进行任何修改。
3.镜像获取方式:
docker pull 镜像地址
docker load -i 本地镜像包
4.镜像构建参数:
5.dockerfile实例:
[root@server1 ~]# mdkir docker
[root@server1 ~]# cd docker/
[root@server1 docker]# cp ~/nginx-1.23.3.tar.gz .
[root@server1 docker]# vim Dockerfile
FROM centos:7
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --with-http_ssl_module --with-http_stub_status_module
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
6.通过dockerfile生成镜像:docker build -t webserver:v1
7.镜像优化示例:
缩减镜像层(docker会将每个指令执行的结果作为一个单独的镜像层,每个镜像层都有自己的文件系统它们相互堆叠):
[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS
-g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --
with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-
1.23.3 && yum clean all
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx", "-g", "daemon off;"]
docker build -t webserver:v2
多阶段构建(允许使用多个from语句构建镜像):
[root@server1 docker]# vim Dockerfile
FROM centos:7 as build
ADD nginx-1.23.3.tar.gz /mnt
WORKDIR /mnt/nginx-1.23.3
RUN yum install -y gcc make pcre-devel openssl-devel && sed -i 's/CFLAGS="$CFLAGS
-g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && ./configure --with-http_ssl_module --
with-http_stub_status_module && make && make install && cd .. && rm -fr nginx-
1.23.3 && yum clean all
FROM centos:7
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;"]