1、明确我们学的是什么 我们学习的是容器技术,并不仅仅是docker,docker仅仅是遵循容器标准的一种实现,只要遵循了容器标准,就可以叫容器技术。比如说最流行的docker,或者红帽的podman都可以叫容器技术。docker仅仅是最开始实现容器技术的一个软件。docker不等于容器,仅仅是容器的一个子集。容器不是虚拟化。
2、docker的由来 2010年,几个年轻人,追求梦想,走向人生巅峰,在美国的旧金山成立了一家dotcloud公司,主要提供PaaS的云计算服务。被迫出现的产物,利益驱使下的产物。
3、docker解决了什么问题? 麻烦的开发环境,麻烦的测试环境,麻烦的集成环境,解决了一个最经典的问题:在我这跑的好好的,怎么到了你那里就不行了呢?上述例子就是一个测试问题,世界上不存在完全一模一样的叶子,也不可能存在完全一模一样的操作系统(测试环境)。但是我们想要这种理想的情况,在我这测试的结果就会和在你那一模一样了。就不会出现上述情况了。docker就彻底解决了这个问题,docker通过打包镜像,将测试环境封装到一个密闭的镜像中,随时随地的在任何地方复制这个镜像。就能实现几乎一模一样的测试环境。
集成环境指的是生产环境的部署阶段,比如说要搭建一个云平台,要在基础设施上安装各种各样的软件,在基础设施上安装软件就意味着各种各样的问题,因为软件是分版本的,不同的软件对系统的要求也不一样。集成环境就是大名鼎鼎的微服务架构。
4、docker的安装 1 2 3 4 5 6 https://docs.docker.com/ 1、我们需要开启centos-extra仓库(linux8是默认开启的) 2、yum install docker-ce docker-ce-cli containerd.io 3、systemctl enable docker --now
5、Docker镜像 1、Docker镜像介绍 在安装完docker-ce之后,默认相当于安装好了docker-cli和docker-ce进程,启动docker-ce进程就算是运行起了docker,但是此时我们并没有可以直接使用的docker私有仓库。镜像其实是装好了特定应用的一个东西,镜像是静态的,容器是动态的。镜像运行起来就是容器,类似于程序和进程。镜像只会占用磁盘空间,但是容器会占用磁盘空间的同时也会占用cpu和内存。
镜像一般是存放在就镜像仓库中的,然后通过docker-cli提供的命令从仓库中拉取镜像,然后将镜像保存在本地,以便后续使用。镜像仓库中的镜像都是压缩过的,压缩的目的是减少镜像的大小,这样在网络传输的时候,可以减少带宽的压力,然后docker的客户端拉取了镜像之后,会对镜像进行解压。
默认情况下docker是需要配置镜像仓库的,一般在生产环境中会配置一个私有的镜像仓库,这样就可以保证镜像传输的安全和速度。
在internet上有很多开源厂商给我们提供了镜像仓库,可以连接这些仓库直接拉取(pull)。
2、Dockerhub介绍和使用 Docker公司为了实现docker容器技术的良好的生态圈,推出了和github类似的东西,叫做dockerhub,是一个公有仓库,任何人都可以在dockerhub上创建自己仓库,然后上传自己镜像(早期的时候) dockerhub已经推出了收费服务 安装完docekr默认拉取的镜像就是在dockerhub拉的
3、配置dockerhub的镜像加速器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 使用阿里云配置镜像加速器 daemon 守护程序 docker image rm hello-world docker container rm 656a796392b7 [root@docekr-ce ~] { "data-root" :"/data/docker" , "storage-driver" :"overlay2" , "registry-mirrors" : ["https://oym4jkot.mirror.aliyuncs.com" ], "insecure-registries" :["registry.access.redhat.com" ,"quay.io" ], "bip" :"172.101.10.1/24" , "live-restore" :true }
4、配置docker的代理 有些情况下我们可能无法直接的访问到某些镜像仓库,但是有一个代理服务器可以访问到,就需要配置代理来访问到镜像仓库。
测试的环境,容器主机没有办法直接访问,但是有一个代理服务器,但是代理服务器的协议是socks5,docker没有办法直接访问socks代理,所以我们需要将socks5的代理转换成http或者https,一般是转换成http
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 1、将socks5的代理转换成http代理 privoxy-3.0.31-1.el8.x86_64 vim /etc/privoxy/config [root@docker ~] listen-address 0.0.0.0:8118 forward-socks5 / 34.87.135.66:10800 [root@docker ~] tcp 0 0 0.0.0.0:8118 0.0.0.0:* LISTEN 1884/privoxy 2、配置docker使用http的代理 mkdir -p /etc/systemd/system/docker.service.d touch /etc/systemd/system/docker.service.d/proxy.conf chmod 777 /etc/systemd/system/docker.service.d/proxy.conf echo '[Service] Environment="HTTP_PROXY=http://192.168.192.200:8118" Environment="HTTP_PROXY=https://192.168.192.200:8118" ' >> /etc/systemd/system/docker.service.d/proxy.conf systemctl daemon-reload systemctl restart docker 3、拉取镜像
5、Docker镜像管理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 1、Docker镜像的拉取 docker pull 就是拉取镜像的命令,默认情况下,不指定仓库就是从dockerhub上拉取镜像,如果指定了仓库,就从对应的仓库中拉取镜像,前提是没有配置镜像仓库的配置文件 2、Docker镜像的删除 [root@docker ~] REPOSITORY TAG IMAGE ID CREATED SIZE centos latest 300e315adb2f 2 months ago 209MB ubuntu latest f643c72bc252 3 months ago 72.9MB hello-world latest bf756fb1ae65 14 months ago 13.3kB 强烈不建议通过IMAGE ID删除镜像,有可能会出现误删除的现象,因为docker存在repository和tag的概念,有可能存在不同的repository和不同的tag但是IMAGE ID是相同的情况,这样如果通过这个命令来删除,如果一样的,会造成同时删除情况 [root@docker ~] [root@docker ~] fb6764367bb3 3、Docker镜像的导出 [root@docker ~] [root@docker ~] anaconda-ks.cfg ubuntu-latest.tar 4、Docker镜像的导入 [root@docker ~] bacd3af13903: Loading layer 75.27MB/75.27MB 9069f84dbbe9: Loading layer 15.36kB/15.36kB f6253634dc78: Loading layer 3.072kB/3.072kB Loaded image: ubuntu:latest 5、docker正在运行镜像的提交,保存成镜像,保存镜像运行的状态 [root@docekr-ce ~] sha256:ffa15a0bc447a1e90b0af6de6dd74d317a69109b951b214c31455ec8517f34dc [root@docekr-ce ~] vorabend/nginx curl ffa15a0bc447 31 seconds ago 141MB
6、使用Dockerhub上创建自己的仓库 1 2 3 4 docker pull docker.io/library/ubuntu:latest 1、在dockerhub上创建账号 2、创建小仓库(repository)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 只能创建一个私有仓库,公有仓库意味着创建的仓库都会被别人看到并拉取,这里指的仓库是repository 3、修改镜像的tag [root@docker ~] [root@docker ~] REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu latest f643c72bc252 3 months ago 72.9MB vorabend/zy ubuntu-latest f643c72bc252 3 months ago 72.9MB 4、登录dockerhub账户 [root@docker ~] Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username: vorabend Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store Login Succeeded 5、上传镜像到自己的dockerhub上 [root@docker ~]# docker push vorabend/zy:ubuntu-latest The push refers to repository [docker.io/vorabend/zy] f6253634dc78: Layer already exists 9069f84dbbe9: Layer already exists bacd3af13903: Layer already exists ubuntu-latest: digest: sha256:4e4bc990609ed865e07afc8427c30ffdddca5153fd4e82c20d8f0783a291e241 size: 943
6、Docker容器 1、Docker容器的介绍 镜像是静态的,将镜像运行起来就是容器,所以容器是动态的,镜像只会占用硬盘,但是容器会占用cou,内存和网络。 镜像的英文:image 容器的英文:container
注意:不能将容器看做成一个操作系统,因为容器不包含内核,没有内核的东西当然不能称为操作系统。
2、一次性运行容器 1 2 3 4 5 6 7 8 9 10 11 12 早期是用docker run ,后来改成了更加显著的命令格式docker container run [root@docker ~] 交互式运行容器 [root@docker ~] [root@b087e607710f /]
3、交互式运行容器
1 2 3 4 5 6 7 8 9 [root@docker ~] [root@b087e607710f /] [root@docker ~] [root@ce2469f5c8aa /]
7、高级操作 1、映射端口 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [root@docekr-ce ~] [root@docekr-ce ~] [root@docekr-ce ~] [root@docekr-ce ~] tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 8053/docker-proxy tcp6 0 0 :::8080 :::* LISTEN 8059/docker-proxy [root@docekr-ce ~] <!DOCTYPE html> <html> <head> <title>Welcome to nginx!</title> <style> body { width: 35em; margin: 0 auto; font-family: Tahoma, Verdana, Arial, sans-serif; } </style> </head> <body> <h1>Welcome to nginx!</h1> <p>If you see this page, the nginx web server is successfully installed and working. Further configuration is required.</p> <p>For online documentation and support please refer to <a href="http://nginx.org/" >nginx.org</a>.<br/> Commercial support is available at <a href="http://nginx.com/" >nginx.com</a>.</p> <p><em>Thank you for using nginx.</em></p> </body> </html>
2、挂载数据卷 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 [root@docekr-ce ~] [root@docekr-ce ~] [root@docekr-ce html] [root@docekr-ce ~] [root@docekr-ce ~] tcp 0 0 0.0.0.0:81 0.0.0.0:* LISTEN 8327/docker-proxy tcp6 0 0 :::81 :::* LISTEN 8334/docker-proxy [root@docekr-ce ~] <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type =text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link= [root@docekr-ce ~] "/root/html:/usr/share/nginx/html" "Destination" : "/usr/share/nginx/html" ,
3、传递环境变量 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@docekr-ce ~] [root@docekr-ce ~] root@8afeca24ef5b:/ abcd [root@docekr-ce ~] PATH=/usr/local /sbin:/usr/local /bin:/usr/sbin:/usr/bin:/sbin:/bin HOSTNAME=b6e03656afe2 E_POTS=abcd NGINX_VERSION=1.12.2-1~stretch NJS_VERSION=1.12.2.0.1.14-1~stretch HOME=/root
8、Dockerfile 1、Dockerfile规则 1 2 3 4 5 6 7 8 9 1 、格式 指令(大写)内容(小写) 尽管指令是大小写不敏感的,但是我们强烈建议指令用大写,内容用小写表示 2 、Docker是按顺序执行Dockerfile里的指令集合的(从上至下依次执行)3 、每一个Dockerfile的第一个非注释行指令,必须是"FROM" 指令,用于为镜像文件构建过程中,指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境中 实践中,基准镜像可以是任何可用镜像文件,默认情况下,docker build会在docker主机(本地)上查找指定的镜像文件,当其在本地不存在时,则会从Docker registry(远端)上拉取所需的镜像文件。
2、USER/WORKDIR 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [root@docekr-ce Dockerfile] FROM docker.io/vorabend/nginx:curl USER nginx WORKDIR /usr/share/nginx/html [root@docekr-ce Dockerfile] Sending build context to Docker daemon 2.048kB Step 1/3 : FROM docker.io/vorabend/nginx:curl ---> ffa15a0bc447 Step 2/3 : USER nginx ---> Running in f51f7307d476 Removing intermediate container f51f7307d476 ---> 227134b80d62 Step 3/3 : WORKDIR /usr/share/nginx/html ---> Running in a50fb1c01515 Removing intermediate container a50fb1c01515 ---> 42d19e11387f Successfully built 42d19e11387f Successfully tagged vorabend/nginx:curl_with_user_workdir [root@docekr-ce Dockerfile] vorabend/nginx curl_with_user_workdir 42d19e11387f About a minute ago 141MB [root@docekr-ce Dockerfile] nginx@9161fdddc358:/usr/share/nginx/html$ whoami nginx nginx@9161fdddc358:/usr/share/nginx/html$ pwd /usr/share/nginx/html
3、ADD/EXPOSE指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [root@docekr-ce Dockerfile] FROM docker.io/vorabend/nginx:curl ADD index.html /usr/share/nginx/html EXPOSE 80 [root@docekr-ce Dockerfile] . ├── Dockerfile └── index.html [root@docekr-ce Dockerfile] Sending build context to Docker daemon 5.12kB Step 1/3 : FROM docker.io/vorabend/nginx:curl ---> ffa15a0bc447 Step 2/3 : ADD index.html /usr/share/nginx/html ---> bdaf4b5822eb Step 3/3 : EXPOSE 80 ---> Running in f6fecbc90c2c Removing intermediate container f6fecbc90c2c ---> 3911ecd68c8d Successfully built 3911ecd68c8d Successfully tagged vorabend/nginx:curl_with_add_expose [root@docekr-ce Dockerfile] root@c0b0e0759837:/ [root@docekr-ce ~] tcp 0 0 0.0.0.0:49156 0.0.0.0:* LISTEN 14654/docker-proxy tcp6 0 0 :::49156 :::* LISTEN 14661/docker-proxy [root@docekr-ce ~] <!DOCTYPE html> <!--STATUS OK--><html> <head><meta http-equiv=content-type content=text/html;charset=utf-8><meta http-equiv=X-UA-Compatible content=IE=Edge><meta content=always name=referrer><link rel=stylesheet type =text/css href=http://s1.bdstatic.com/r/www/cache/bdorz/baidu.min.css><title>百度一下,你就知道</title></head> <body link=
4、RUN/ENV 1 2 3 4 5 6 7 8 9 10 11 12 13 [root@docekr-ce Dockerfile] FROM ubuntu ENV VER nginx RUN apt update -y && apt install $VER -y [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] vorabend/ubuntu with_nginx 584510dc7759 About a minute ago 167MB [root@docekr-ce Dockerfile] root@16646bad2278:/ /usr/sbin/nginx
5、CMD/ENTRYPOINT指令 1、CMD指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [root@docekr-ce Dockerfile] FROM centos:7 ENV VER httpd RUN yum update -y && yum install $VER -y CMD ["httpd" ,"-D" ,"FOREGROUND" ] [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] vorabend/centos centos_httpd_CMD 31f3dadaf231 54 seconds ago 538MB [root@docekr-ce Dockerfile] 4d698e58fe331f7dea4104338016063b2f250ce47399540c2e9be59d5f9b1d4b [root@docekr-ce Dockerfile] CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4d698e58fe33 vorabend/centos:centos_httpd_CMD "httpd -D FOREGROUND" 59 seconds ago Up 58 seconds [root@docekr-ce Dockerfile] tcp 0 0 0.0.0.0:83 0.0.0.0:* LISTEN 22694/docker-proxy tcp6 0 0 :::83 :::* LISTEN 22701/docker-proxy [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] 0
2、ENTRYPOINT指令 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 [root@docekr-ce Dockerfile] /sbin/nginx -g "daemon off;" [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] FROM centos:7 ADD entrypoint.sh /entrypoint.sh ENV VER nginx RUN yum update -y && yum install epel-release -y && yum install $VER -y ENTRYPOINT /entrypoint.sh [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] vorabend/centos nginx_entrypoint f7478860101d 25 seconds ago 575MB [root@docekr-ce Dockerfile] 870bd36cd5a1b4b20cd8af8077fca7b4e04cf3d4d088832fa853ec94d87c0f97 [root@docekr-ce Dockerfile] <html> <head><title>403 Forbidden</title></head> <body> <center><h1>403 Forbidden</h1></center> <hr><center>nginx/1.20.1</center> </body> </html>
6、综合实验 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 [root@docekr-ce Dockerfile] FROM nginx:1.12.2 USER root ENV WWW /usr/share/nginx/html ENV CONF /etc/nginx/conf.d RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' > /etc/timezone WORKDIR $WWW ADD index.html $WWW /index.html ADD demo.od.com.conf $CONF /demo.od.com.conf EXPOSE 80 CMD ["nginx" ,"-g" ,"daemon off;" ] [root@docekr-ce Dockerfile] server { listen 80; server_name demo.od.com; root /usr/share/nginx/html; } [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] vorabend/nginx all_test da35eb97f64e 28 seconds ago 108MB [root@docekr-ce Dockerfile] cc7d7ea870c063587bb8fba1fae2fa8c2694346d501aafc288ddd23b2b41a6d9 [root@docekr-ce Dockerfile] cc7d7ea870c0 vorabend/nginx:all_test "nginx -g 'daemon of…" 33 seconds ago Up 31 seconds 0.0.0.0:49161->80/tcp, :::49161->80/tcp all_test [root@docekr-ce Dockerfile] [root@docekr-ce Dockerfile] 0
9、Docker的网络模型 1、NAT(默认) 2、None 3、HOST 4、联合网络 1 2 3 4 5 6 [root@docekr-ce Dockerfile] 1d3a164e3d61455beb7f76974e10b6f12fb1d2679f39d1d14e4ec3b8f9a276f0 [root@docekr-ce Dockerfile]