Docker鏡像制作
1、Docker鏡像有沒有內核?
從鏡像大小上面來說,一個比較小的鏡像只有十幾MB,而內核文件需要一百多兆,因此鏡像里面是沒有內核的,鏡像在被啟動為容器后將直接使用宿主機的內核,而鏡像本身則只提供相應的rootfs,即系統正常運行所必須的用戶空間的文件系統,比如 /dev,/,/proc,/bin /etc等目錄,所以容器當中基本是沒有/boot目錄的,而/boot當中保存的就是與內核相關的文件和目錄 。
2、為什么沒有內核?
由於容器啟動和運行過程中是直接使用宿主機的內核,所以沒有直接調用過物理硬件所以也不會涉及到硬件驅動, 因此也用不上內核和驅動,另外有內核的那是虛擬機。
1、DockerFile制作yum版nginx鏡像
DockerFile可以說是 一種可以被 Docker程序解釋的腳本, DockerFile是由一條條的命令組成的,每條命令對應linux下面的一條命令, Docker 程序將這些DockerFile指令再翻譯成真正的指令再翻譯成真正的linuxlinux命令,Docker 程序讀取DockerFile並根據指令生成 Docker 鏡像,相比手動制作鏡像的方式, DockerFile更能直觀的展示鏡像是怎么產生的,有了DockerFile,當后期有額外的需求時,只要在之前的 DockerFile添加或者修改響應的命令即可。重新生成新的 Docker鏡像,避免了重復手動制作鏡像的麻煩,具體如下:
實戰一:Dockerfile制作nginx鏡像
1、Dockerfile制作yum版nginx鏡像
1、先經過docker下載centos鏡像
[root@centos-7 ~]# yum install docker-ce -y #安裝官網docker-ce,默認安裝最新版 [root@centos-7 ~]# systemctl start docker #啟動docker [root@centos-7 ~]# docker pull centos #下載centos鏡像
2、切換到一個新建的nginx目錄下,進行實驗測試
[root@centos-7 ~]# mkdir /data/nginx [root@centos-7 ~]# cd /data/nginx
3、創建一個nginx測試頁,然后訪問網頁測試
[root@centos-7 nginx]# cd /data/nginx [root@centos-7 nginx]# cat index.html #修改一個測試頁面 nginx web test [root@centos-7 nginx]# cat index1.html #修改一個測試頁面 nginx web index1 test [root@centos-7 nginx]# tar zcvf code.tar.gz index1.html index.html
4、開始在nginx目錄下創建一個Dockerfile文件,創建的nginx鏡像,不能在鏡像內改配置文件,只能將配置文件傳出來,在宿主機內修改,然后再傳到配置文件中,測試的代碼也是如此。
FROM centos MAINTAINER liu 958421213@@qq.com RUN yum install epel-release -y && yum install nginx -y && rm -rf /usr/share/nginx/html/index.html #如果加入后面的rm -rf 命令后,就會重新執行前面的安裝 ENV MY_HOST 192.168.7.101 ADD code.tar.gz /usr/share/nginx/html/ # 直接導入壓縮的包,ADD選項是解壓包,用COPY就是不解壓 EXPOSE 80 443 CMD ["nginx"]
5、制作鏡像腳本
[root@centos-7 nginx]# cat build-command.sh #!/bin/bash TAG=$1 docker build -t nginx:$1 .
6、執行制作鏡像腳本
[root@centos-7 nginx]# bash build-command.sh make
7、運行docker容器並啟動nginx
[root@centos-7 nginx]# docker images # 查看docker鏡像 REPOSITORY TAG IMAGE ID CREATED SIZE nginx make eca08b87df7f 5 minutes ago 511MB nginx 2020 ed020900aa3c 20 minutes ago 317MB centos latest 0f3e07c0138f 3 months ago 220MB [root@centos-7 nginx]# docker run -it --rm -p 80:80 nginx:make bash # 啟動nginx:make鏡像,--rm測試完就會刪除此鏡像 [root@da4569e4a5e3 /]# nginx #啟動nginx Cannot parse dst/src address. [root@da4569e4a5e3 /]# ss -anlt State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:80 0.0.0.0:* LISTEN 0 128 [::]:80 [::]:*
8、網頁測試:
兩個不同的html訪問都已成功:
9、如果需要修改配置文件,不能在鏡像里邊進行修改,需要將配置文件傳出來修改,然后再傳回去再次創建鏡像。
[root@aef982ee5d27 /]# sz /etc/nginx/nginx.conf
10、修改后的Dockerfile文件
FROM centos MAINTAINER liu 958421213@@qq.com RUN yum install epel-release -y && yum install nginx -y && rm -rf /usr/share/nginx/html/index.html #如果加入后面的rm -rf 命令后,就會重新執行前面的安裝 ENV MY_HOST 192.168.7.101 ADD nginx.conf /etc/nginx/ # 修改后的配置文件加上此選項即可 ADD code.tar.gz /usr/share/nginx/html/ # 直接導入壓縮的包,ADD選項是解壓包,用COPY就是不解壓 EXPOSE 80 443 CMD ["nginx"]
2、Dockerfile編譯nginx鏡像
nginx源碼包下載官網:https://nginx.org/en/download.html
1、創建一個nginx測試頁,然后訪問網頁測試
[root@centos-7 nginx]# cd /data/nginx [root@centos-7 nginx]# cat index.html #修改一個測試頁面 nginx web test [root@centos-7 nginx]# cat index1.html #修改一個測試頁面 nginx web index1 test [root@centos-7 nginx]# tar zcvf code.tar.gz index1.html index.html
2、在上面的基礎修改Dockerfile配置文件
[root@centos-7 nginx]# cat Dockerfile FROM centos MAINTAINER liu 29737xxxx0@qq.com RUN yum install epel-release -y && yum install vim iotop bc gcc gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel zip unzip zlib- devel net-tools lrzsz tree telnet lsof tcpdump wget libevent libevent-devel bc systemd-devel bash-completion traceroute -y RUN yum groupinstall "development tools" -y #添加一個開發包組,為了編譯安裝 ADD nginx-1.14.2.tar.gz /usr/local/src RUN cd /usr/local/src/nginx-1.14.2 && ./configure --prefix=/apps/nginx && make && make install && ln -sv /apps/nginx/sbin/nginx /usr/sbin/nginx #COPY nginx.conf /apps/nginx/conf #ENV MY_HOST 192.168.7.101 #ADD nginx.conf /etc/nginx/ ADD code.tar.gz /apps/nginx/html/ EXPOSE 80 443 CMD ["nginx"]
3、制作鏡像腳本
[root@centos-7 nginx]# cat build-command.sh #!/bin/bash TAG=$1 docker build -t nginx:$1 .
4、執行制作鏡像腳本
[root@centos-7 nginx]# bash build-command.sh make
5、執行創建鏡像腳本
[root@centos-7 nginx]# bash build-command.sh make
6、運行鏡像,並啟動nginx服務
[root@centos-7 nginx]# docker run -it --rm -p 80:80 nginx:make bash [root@ae4b6e0b4d0b /]# ss -ltnp State Recv-Q Send-Q Local Address:Port Peer Address:Port [root@ae4b6e0b4d0b /]# nginx [root@ae4b6e0b4d0b /]# ll bash: ll: command not found [root@ae4b6e0b4d0b /]# ss -nltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=18,fd=6)) [root@ae4b6e0b4d0b /]# exit
7、網頁測試:
兩個不同的html訪問都已成功:
3、docker下載Mysql鏡像
1、直接pull下載mysql鏡像
[root@centos7 ]# docker pull mysql:5.6.44
2、運行此鏡像,需要指定密碼,加上-e選項才能初始化成功mysql數據庫
[root@centos-7 nginx]# docker run -it --rm -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6.44 # 做一個端口映射
3、在另一台mysql客戶端進行測試連接
[root@centos-7 ~]# mysql -p123456 -h192.168.7.100 Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.44 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
注意:將數據庫的數據最好能存在宿主機的/var/lib/mysql目錄下,避免容器刪除后,數據庫還能在下一個容器上繼續運行。