docker镜像了解(建立私有仓库,基于已有镜像创建,Docker的数据管理) 基于Dockerfile创建,基于本地模板创建,端口映射,容器互联)
文章目錄
- docker鏡像
- 制作鏡像的過程
- 基于已有鏡像創建
- 基于本地模板創建
- 基于Dockerfile創建
- Dockerfile操作指令
- Docker的數據管理
- 數據卷
- docker的網絡通信
- 容器互聯
- 配置docker
- 基于已有鏡像創建實驗過程
- 基于本地模板創建實驗過程
- 基于基礎鏡像實驗過程
- Docker數據卷
- 驗證階段
- 數據卷容器
- 建立私有倉庫
- 刪除與恢復
- 端口映射
- 容器互聯
docker鏡像
制作鏡像的過程
Docker鏡像的創建
●應用發布的標準格式
●支撐一個Docker容器的運行
Docker鏡像的創建方法
●基于已有鏡像創建
●基于本地模板創建
●基于Dockerfile創建
基于已有鏡像創建
將容器里面運行的程序及運行環境打包生成新的鏡像
docker commit[選項]容器ID/名稱倉庫名稱:[標簽]- -m說明信息
- -a作者信息
- -p生成過程中停止容器的運行
基于本地模板創建
- 通過導入操作系統模板文件生成新的鏡像
- 使用wget命令導入為本地鏡像
導入成功后可查看本地鏡像信息
docker images lgrep new基于Dockerfile創建
Dockerfile是由一組指令組成的文件
Dockerfile結構四部分
-
基礎鏡像信息
-
維護者信息
-
鏡像操作指令
-
容器啟動時執行指令
Dockerfile每行支持一條指令,每條指令可攜帶多個參
數,支持使用以“#“號開頭的注釋
Dockerfile操作指令
| FROM鏡像 | 指定新鏡像所基于的境像,第一條指令必須為FROM指令,每創建一個鏡像就需要—條FROM指令。 |
| MAINTAINER名字 | 說明新鏡像的維護人信息 |
| RUN命令 | 在所基于的鏡像上執行命令,并提交到新的鏡像中 |
| CMD[“要運行的程序“,”參數1,“參數2“] | 指令啟動容器時要運行的命令或者腳本,Dockerfile只能有,一條CMD命令,如果指定多條則只能最后一條祧執行 |
| EXPOSE端口號 | 指定新鏡像加載到Docker時要開啟的端口 |
| ENV環境變量變量值 | 設置一個環境變量的值,會被后面的RUN使用 |
| ADD 源文件/目錄目標文件/目錄 | 將源文件復制到目標文件,源文件要與Dockerfile位于相同,目錄中,或者是一個URL |
| COPY 源文件/目錄目標文件/目錄 | 將本地主機上的文件/目錄復制到目標地點,源文件/目錄要與Dockerfile在相同的目錄中 |
| VOLUME[“目錄“] | 在容器中創建一個掛載點 |
| USER 用戶名/UID | 指定運行容器時的用戶 |
| WORKDIR路徑 | 為后續的RUNCMD、ENTRYPOINT指定工作目錄 |
| ONBUILD命令 | 指定所生成的鏡像作為一個基礎鏡像時所要運行的命令 |
| HEALTHCHECK | 健康檢查 |
ADD與RUN的區別:
ADD是外部宿主機上某一個文件復制到容器上面
RUN是在容器的路徑復制到自己的另一個路徑
Docker的數據管理
數據管理操作
-
方便查看容器內產生的數據
-
多容器間實現數據共享
兩種管理方式
●數據卷
●數據卷容器
數據卷
數據卷是一個提供容器使用的特殊目錄
創建數據卷
掛載主機目錄作為數據卷
docker run -d -v /var/www:/data1 --name web-1 httpd:centos-v:提供2個目錄
數據卷與數據卷容器的區別:
數據卷是與宿主機連接;數據卷容器是容器與容器連接
docker的網絡通信
端口映射
●端口映射機制將容器內的服務提供給外部網絡訪問
●可隨機或指定映射端口范圍
容器互聯
●在源容器和接收容器間建立一條網絡通信隧道
●使用docker run命令–link選項實現容器間互聯通信
實現容器互聯
配置docker
[root@localhost ~]# yum install -y yum-untils device-mapper-persistent-data lvm2 設置阿里云鏡像源 [root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo [root@localhost yum.repos.d]# yum install docker-ce 開啟容器 [root@localhost ~]# systemctl start docker.service 鏡像加速cd /etc/docker/tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://ctzniuyu.mirror.aliyuncs.com"] } EOF[root@localhost docker]# systemctl daemon-reload [root@localhost docker]# systemctl restart docker ----------------------網頁優化-----------[root@localhost docker]# vim /etc/sysctl.conf net.ipv4.ip_forward=1[root@localhost docker]# sysctl -p [root@localhost docker]# service network restart [root@localhost docker]# systemctl restart docker查看docker是否開啟
[root@localhost docker]# ifconfig docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255ether 02:42:fe:77:f0:77 txqueuelen 0 (Ethernet)RX packets 0 bytes 0 (0.0 B)RX errors 0 dropped 0 overruns 0 frame 0TX packets 0 bytes 0 (0.0 B)TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0基于已有鏡像創建實驗過程
下載鏡像
[root@localhost docker]# docker pull centos:7創建容器
[root@localhost docker]# docker create -it centos:7 /bin/bash開啟容器
[root@localhost docker]# docker start 394a829c69f5創建鏡像
[root@localhost docker]# docker commit -m "new" -a "daoke" 394a829c69f5 daoke:test查看鏡像
[root@localhost docker]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE daoke test 6874a5a17024 About a minute ago 203MB centos 7 7e6257c9f8d8 5 weeks ago 203MB基于本地模板創建實驗過程
放入模板進去debian-7.0-x86-minimal.tar.gz
[root@localhost opt]# cat debian-7.0-x86-minimal.tar.gz | docker import - daoke:new基于基礎鏡像實驗過程
創建Dockerfile
[root@localhost opt]# mkdir apache [root@localhost opt]# cd apache/ [root@localhost apache]# vim Dockerfile (名字不可以改必須是這個) FROM centos:7 #維護鏡像的用戶信息 MAINTAINER THIS IS ky03 RUN yum -y update RUN yum -y install httpd #開啟80端口 EXPOSE 80 #復制網址首頁文件 ADD index.html /var/www/html/index.html #執行腳本復制到鏡像中 ADD run.sh /run.sh RUN chmod 755 /run.sh #啟動容器執行腳本 CMD ["/run.sh" ]編寫網址
[root@localhost apache]# vim index.html <h1>this is 01web </h1>編寫啟動命令
[root@localhost apache]# vim run.sh #!/bin/bash rm -rf /run/httpd/* exec /usr/sbin/apachectl -D FOREGROUND生成鏡像
[root@localhost apache]# docker build -t httpd:centos .//映射端口運行容器
docker run -d -p 8080:80 httpd:centos畫圖理解
我們映射的是8080給外網可以訪問
打開游覽去查看
http://192.168.136.88:8080
Docker數據卷
場景:我們要添加一些插件可以直接在/var/www中寫入就可以在容器中添加
可以直接把宿主機/var/www文件掛載到容器/data1
[root@localhost ~]# docker run -v /var/www:/data1 --name web1 -it centos:7 /bin/bash可以看到/var/www已經生成
驗證階段
1和2是相同中終端
開啟一臺相同的終端(192.168.136.30-1)
[root@176ee193587a /]# cd data1/ [root@176ee193587a data1]# touch abc.txt [root@176ee193587a data1]# ls abc.txt開啟一臺相同的終端(192.168.136.30-2)
[root@localhost ~]# cd /var/www/ [root@localhost www]# ls abc.txt數據卷容器
場景:可以通過數據卷容器共享就可以跟新一個容器讓其他所有的容器更新
創建數據卷容器
[root@localhost ~]# docker run --name web100 -v /data1 -v /data2 -it centos:7 /bin/bash新容器掛載數據卷web100
docker run -it --volumes-from web100 --name web99 centos:7 /bin/bash查看是否成功
建立私有倉庫
下載鏡像 (端口號5000)
[root@localhost apache]# docker pull registry添加私庫加速
{"insecure-registries":["192.168.136.30:5000" ],"registry-mirrors": ["https://ctzniuyu.mirror.aliyuncs.com"] }注意:逗號一定要加不然報錯
開啟服務
[root@localhost ~]# systemctl restart docker查看狀態
[root@localhost apache]# systemctl status docker創建容器
[root@localhost apache]# docker create -it registry /bin/bash開啟容器
[root@localhost ~]# docker start 544bddf8706a 544bddf8706a [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 544bddf8706a registry "/entrypoint.sh /bin…" About a minute ago Exited (127) 34 seconds ago distracted_wu我們發現還是沒有開啟
是應為沒有添加守護進程
[root@localhost ~]# docker run -d -p 5000:5000 -v /data/registry:/tmp/registry registry [root@localhost ~]# docker ps -a 查看已經開啟 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3f17e9bddded registry "/entrypoint.sh /etc…" 20 seconds ago Up 19 seconds上傳倉庫
添加nginx鏡像
[root@localhost apache]# docker pull nginx上傳到私庫
docker tag nginx:latest 192.168.136.30:5000/nginx顯示上傳內容(上傳沒有成功)
[root@localhost ~]# curl -XGET http://192.168.136.30:5000/v2/_catalog {"repositories":[]}測試私有庫倉庫下載
[root@localhost ~]# docker push 192.168.136.30:5000/nginx顯示上傳成功
[root@localhost ~]# curl -XGET http://192.168.136.30:5000/v2/_catalog {"repositories":["nginx"]}刪除與恢復
刪除私庫
[root@localhost apache]# docker rmi nginx:latest [root@localhost apache]# docker rmi 192.168.136.30:5000/nginx:latest上傳恢復私庫
[root@localhost apache]# docker pull 192.168.136.30:5000/nginx端口映射
[root@localhost ~]# docker run -d -P 192.168.136.30:5000/nginx 42ebf8922afd4c486947f83d3b71eb5f4460278be6abafbd0af1dd7e6e3bdc84 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 42ebf8922afd 192.168.136.30:5000/nginx "/docker-entrypoint.…" 32 seconds ago Up 30 seconds 0.0.0.0:32768->80/tcp affectionate_yalow容器互聯
連接web11和其他通信(創建并運行web1,端口號自動映射)
[root@localhost apache]# docker run -itd -P --name web11 centos:7進入容器
[root@localhost ~]# docker exec -it 5dc597e17ad5 /bin/bash在開啟一臺終端
[root@localhost ~]# docker run -itd -P --name web22 --link web11:web11 centos:7 /bin/bash進入容器
[root@localhost ~]# docker exec -it a553cf01f492 /bin/bashweb22可以ping同文本11容器可以互通
[root@a553cf01f492 /]# ping web11 PING web11 (172.17.0.4) 56(84) bytes of data. 64 bytes from web11 (172.17.0.4): icmp_seq=1 ttl=64 time=0.099 ms 64 bytes from web11 (172.17.0.4): icmp_seq=2 ttl=64 time=0.252 ms查看各容器端口
[root@5dc597e17ad5 /]# yum -y install net-toolsweb11
web12
這里172.17.0.4是哪里來的那,其實是docker0網卡,這個網卡充當這網關,網關并分配給容器地址:如web22分配了127.17.0.4
如下圖:
總結
以上是生活随笔為你收集整理的docker镜像了解(建立私有仓库,基于已有镜像创建,Docker的数据管理) 基于Dockerfile创建,基于本地模板创建,端口映射,容器互联)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: z170内存:性能狂人还是稳定之选?
- 下一篇: docker构建容器服务