Dockerfile实战
文章目錄
- 一: 構(gòu)建SSH鏡像
- 1.1 創(chuàng)建工作目錄,編寫Dockerfile 文件
- 1.2 生成鏡像,啟動(dòng)容器,使用ssh進(jìn)入容器
- 二: 創(chuàng)建systmctl 鏡像
- 2.1 創(chuàng)建Dockerfile文件
- 2.2 生成鏡像,啟動(dòng)容器
- 三: 創(chuàng)建tomcat 鏡像
- 3.1 編寫Dockerfile
- 3.2 創(chuàng)建鏡像,啟動(dòng)容器
- 四: 創(chuàng)建mysql 鏡像
- 4.1 編譯Dockerfile
- 4.2 創(chuàng)建鏡像,啟動(dòng)容器
一: 構(gòu)建SSH鏡像
1.1 創(chuàng)建工作目錄,編寫Dockerfile 文件
[root@host103 ~]# mkdir /opt/sshd [root@host103 ~]# cd /opt/sshd/ [root@host103 sshd]# vim Dockerfile #第一行必須指明基于的基礎(chǔ)鏡像 FROM centos:7 #作者信息 MAINTAINER this is ssh image <zhi>#鏡像的操作指令。一個(gè)run就是一層鏡像。所以,要盡量少用run。此處為了更清晰,就分開寫 #下載軟件包 RUN yum -y install openssh* net-tools lsof telnet passwd #創(chuàng)建root 用戶,配置密碼 RUN echo "abc1234" | passwd --stdin root #不使用PAM認(rèn)證 RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config RUN sed -ri '/^session\s+required\s+pam_loginuid.so/ s/^/#/' /etc/pam.d/sshd#使用默認(rèn)配置,免交互生成rsa的密鑰認(rèn)證文件 RUN ssh-keygen -t rsa -A RUN mkdir -p /root/.ssh && chown root.root /root && chmod 700 /root/.ssh#CMD容器啟動(dòng)時(shí)執(zhí)行的第一條命令。/usr/sbin/sshd -D ,前臺(tái)啟動(dòng)sshd服務(wù) CMD /usr/sbin/sshd -D #對(duì)外暴露端口22 EXPOSE 22關(guān)于 ssh-keygen -t rsa -A 的解釋官方的解釋是“對(duì)于主機(jī)密鑰不存在的每個(gè)密鑰類型(rsa1、rsa、dsa和ecdsa),生成主機(jī)密鑰具有默認(rèn)密鑰文件路徑、空密碼短語(yǔ)、密鑰類型的默認(rèn)位和默認(rèn)的評(píng)論。系統(tǒng)管理腳本使用它來(lái)生成新的主機(jī)密鑰。”就是說(shuō),在**不使用-t 指定加密算法的情況下,**當(dāng)主機(jī)沒(méi)有密鑰類型(rsa,dsa,ecdsa),則使用-A項(xiàng)后,會(huì)根據(jù)默認(rèn)配置,免交互生成該密算法的密鑰對(duì)文件。比如說(shuō),只有dsa,ecdsa密鑰對(duì),沒(méi)有rsa的密鑰對(duì)時(shí),使用該命令則會(huì)根據(jù)默認(rèn)配置,生成rsa密鑰對(duì)其生成的密鑰文件由配置文件 /etc/ssh/sshd_config的 HostKey 項(xiàng)定義。不同的加密算法,生成的文件不同。但是都是保存在默認(rèn)的 /etc/ssh/ 目錄下
1.2 生成鏡像,啟動(dòng)容器,使用ssh進(jìn)入容器
#在當(dāng)前目錄使用 Dockerfile 創(chuàng)建鏡像 sshd:centos [root@host103 sshd]# docker build -t sshd:centos .[root@host103 sshd]# docker run -d -P sshd:centos 3ba3afe471ee4f7ef23cc8d18abfefd310d38c95d1f07e521988236841fe32f9 [root@host103 sshd]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3ba3afe471ee sshd:centos "/bin/sh -c '/usr/sb…" 5 seconds ago Up 4 seconds 0.0.0.0:49156->22/tcp, :::49156->22/tcp jovial_mirzakhani[root@host103 sshd]# ssh 127.0.0.1 -p 49156 [root@3ba3afe471ee ~]#二: 創(chuàng)建systmctl 鏡像
2.1 創(chuàng)建Dockerfile文件
[root@host103 ~]# mkdir /opt/systemctl [root@host103 ~]# cd /opt/systemctl/[root@host103 systemctl]# vim Dockerfile #基于sshd:centos 鏡像創(chuàng)建 FROM sshd:centos MAINTAINER this is systemctl image by using sshd image <zhi>#除了systemcd-tmpfiles-setup.service,刪除目錄下/lib/systemd/system/sysinit.target.wants/所有文件. RUN (cd /lib/systemd/system/sysinit.target.wants/;for i in *;do [ $i == systemd-tmpfiles-setup.service ] || rm -f $i; done); \ rm -f /lib/systemd/system/multi-user.target.wants/*; \ rm -f /etc/systemd/system/*.wants/*; \ rm -f /lib/systemd/system/local-fs.target.wants/*; \ rm -f /lib/systemd/system/sockets.target.wants/*udev*; \ rm -f /lib/systemd/system/sockets.target.wants/*initctl*; \ rm -f /lib/systemd/system/basic.target.wants/*;\ rm -f /lib/systemd/system/anaconda.target.wants/*; #創(chuàng)建數(shù)據(jù)卷 VOLUME [ "/sys/fs/cgroup" ] #CMD ["/usr/sbin/init"]2.2 生成鏡像,啟動(dòng)容器
#生成鏡像 [root@host103 systemctl]# docker build -t systemd:centos .#啟動(dòng)容器,并掛載宿主機(jī)目錄到容器(權(quán)限為只讀),進(jìn)行初始化。 #-d 為此容器分離終端,放入后臺(tái)啟動(dòng)。如果不加,則會(huì)一直卡在當(dāng)前界面 #如果不使用-d 選項(xiàng),也可以在命令最后使用 & 放入后臺(tái) [root@host103 systemctl]# docker run --privileged -itd -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init[root@host103 systemctl]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f5b9f0c6170c systemd:centos "/sbin/init" 9 seconds ago Up 8 seconds 0.0.0.0:49157->22/tcp, :::49157->22/tcp frosty_cray#進(jìn)入容器 [root@host103 systemctl]# docker exec -it f5 bash #能夠使用systemctl status 命令 [root@f5b9f0c6170c /]# systemctl status sshd #啟動(dòng)sshd服務(wù) [root@f5b9f0c6170c /]# systemctl start sshddocker run --privileged -itd -P -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:centos /sbin/init 命令解析
–privileged: 使得容器內(nèi)的root 擁有真正的root權(quán)限。否則,容器內(nèi)的root只是外部的一個(gè)普通用戶權(quán)限。
-v /sys/fs/cgroup:/sys/fs/cgroup:ro: 將宿主機(jī)的/sys/fs/cgroup 共享到容器的該目錄,權(quán)限為只讀。因?yàn)槿萜鲀?nèi)的該目錄是空。而systemd依賴于cgroups,/sys/fs/cgroup/systemd目錄是systemd 維護(hù)的自己使用的非 subsystem 的 cgroups 層級(jí)結(jié)構(gòu)
/sbin/init: init初始化命令,這個(gè)命令一直運(yùn)行的前臺(tái)。
三: 創(chuàng)建tomcat 鏡像
3.1 編寫Dockerfile
#創(chuàng)建工作目錄 [root@host103 ~]# mkdir /opt/tomcat [root@host103 ~]# cd /opt/tomcat/#將源碼包上傳到工作目錄 [root@host103 tomcat]# ls apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz apache-tomcat-8.5.16.tar.gz jdk-8u91-linux-x64.tar.gz[root@host103 tomcat]# vim Dockerfile #基于centos:7 鏡像創(chuàng)建 FROM centos:7MAINTAINER this is tomcat image <zhi>#ADD指令可以自動(dòng)解要并軟件包到/usr/local/目錄 ADD jdk-8u91-linux-x64.tar.gz /usr/local/#配合環(huán)境變量 ENV JAVA_HOME /usr/local/jdk1.8.0_91 ENV JRE_HOME ${JAVA_HOME}/jre ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib ENV PATH $JAVA_HOME/bin:$PATH#復(fù)制并解壓軟件包 ADD apache-tomcat-8.5.16.tar.gz /usr/local/ #切換工作目錄 WORKDIR /usr/local/ RUN mv apache-tomcat-8.5.16 /usr/local/tomcat#啟動(dòng)8080端口 EXPOSE 8080#前臺(tái)啟動(dòng)tomcat CMD /usr/local/tomcat/bin/catalina.sh run3.2 創(chuàng)建鏡像,啟動(dòng)容器
#在當(dāng)前目錄使用Dockerfile創(chuàng)建鏡像tomcat:centos [root@host103 tomcat]# docker build -t tomcat:centos .#啟動(dòng)容器,映射容器的8080端口到 宿主機(jī)的1234端口 [root@host103 tomcat]# docker run -d --name tomcat1 -p 1234:8080 tomcat:centos #瀏覽器訪問(wèn)宿主機(jī)的ip:1234端口 [root@host103 tomcat]# firefox http://192.168.23.103:1234四: 創(chuàng)建mysql 鏡像
4.1 編譯Dockerfile
#創(chuàng)建工作目錄 [[root@host103 ~]# mkdir /opt/mysql [root@host103 ~]# cd /opt/mysql/#將軟件包上傳到工作目錄 [root@host103 mysql]# ls mysql-boost-5.7.20.tar.gz mysql-boost-5.7.20.tar.gz#編寫Dockerfile [root@host103 mysql]# vim Dockerfile #基于centos:7鏡像創(chuàng)建 FROM centos:7 MAINTAINER this is mysql image <zhi> #復(fù)制軟件包和配置文件到容器(使用ADD指令復(fù)制時(shí),會(huì)自動(dòng)解壓壓 ADD mysql-boost-5.7.20.tar.gz /opt/ ADD my.cnf /etc/my.cnf #切換工作目錄 WORKDIR /opt/mysql-5.7.20 #下載軟件包 RUN useradd -M -s /sbin/nologin mysql && yum -y install gcc gcc-c++ ncurses ncurses-devel bison cmake make#編譯安裝mysql RUN cmake \ -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ -DMYSQL_UNIX_ADDR=/usr/local/mysql/mysql.sock \ -DSYSCONFDIR=/etc \ -DSYSTEMD_PID_DIR=/usr/local/mysql \ -DDEFAULT_CHARSET=utf8 \ -DDEFAULT_COLLATION=utf8_general_ci \ -DWITH_EXTRA_CHARSETS=all \ -DWITH_INNOBASE_STORAGE_ENGINE=1 \ -DWITH_ARCHIVE_STORAGE_ENGINE=1 \ -DWITH_BLACKHOLE_STORAGE_ENGINE=1 \ -DWITH_PERFSCHEMA_STORAGE_ENGINE=1 \ -DMYSQL_DATADIR=/usr/local/mysql/data \ -DWITH_BOOST=boost \ -DWITH_SYSTEMD=1 ; \ make -j 4 && make installRUN chown -R mysql:mysql /usr/local/mysql/ ;chown mysql:mysql /etc/my.cnf#設(shè)置環(huán)境變量 ENV PATH /usr/local/mysql/bin:/usr/local/mysql/lib:$PATH #切換工作目錄 WORKDIR /usr/local/mysql/bin/ #初始化數(shù)據(jù)庫(kù) RUN ./mysqld \ --initialize-insecure \ --user=mysql \ --basedir=/usr/local/mysql \ --datadir=/usr/local/mysql/data #開發(fā)端口3306 EXPOSE 3306RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/#設(shè)置mysqld服務(wù)自啟動(dòng)(此時(shí)無(wú)法使用start,status等選項(xiàng)) RUN systemctl enable mysqld#使用/sbin/init,讓容器啟動(dòng)后的第一個(gè)進(jìn)程始終是前臺(tái)進(jìn)程 CMD /sbin/init#在工作目錄創(chuàng)建mysql的配置文件 [root@host103 mysql]# vim my.cnf [client] port = 3306 default-character-set=utf8 socket=/usr/local/mysql/mysql.sock[mysql] port = 3306 default-character-set=utf8 socket = /usr/local/mysql/mysql.sock auto-rehash[mysqld] user = mysql basedir=/usr/local/mysql datadir=/usr/local/mysql/data port = 3306 character-set-server=utf8 pid-file = /usr/local/mysql/mysqld.pid socket=/usr/local/mysql/mysql.sock bind-address = 0.0.0.0 skip-name-resolve max_connections=2048 default-storage-engine=INNODB max_allowed_packet=16M server-id = 1sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,PIPES_AS_CONCAT,ANSI_QUOTES4.2 創(chuàng)建鏡像,啟動(dòng)容器
[root@host103 mysql]# docker build -t mysql:centos .#創(chuàng)建并啟動(dòng)容器。和容器共享/sys/fs/cgroup,同時(shí)給容器里root授權(quán) [root@host103 mysql]#docker run --privileged -P -itd --name mysql01 -v /sys/fs/cgroup/:/sys/fs/cgroup mysql:centos[root@host103 mysql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 36051ced25dd mysql:centos "/bin/sh -c /sbin/in…" 35 minutes ago Up 6 seconds 0.0.0.0:49153->3306/tcp, :::49153->3306/tcp mysql01#進(jìn)入容器 [root@host103 mysql]#docker exec -it mysql01 bash #mysqld服務(wù)已經(jīng)啟動(dòng) [root@36051ced25dd bin]# netstat -anpt | grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 148/mysqld#初始化時(shí)空密碼 [root@36051ced25dd bin]# mysql -uroot -pmysql> grant all privileges on *.* to 'root'@'%' identified by 'abc123'; Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> grant all privileges on *.* to 'root'@'localhost' identified by 'abc123'; Query OK, 0 rows affected, 2 warnings (0.00 sec)mysql> flush privileges;mysql>exit[root@36051ced25dd bin]# exit#客戶端安裝mysql或者mariadb 進(jìn)行連接測(cè)試 [root@host104 ~]# yum -y install mariadb mariadb-server[root@host104 ~]# systemctl start mariadb [root@host104 ~]# mysql -uroot -pabc123 -h 192.168.23.103 -P 49153總結(jié)
以上是生活随笔為你收集整理的Dockerfile实战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: docker的镜像创建与Dockefil
- 下一篇: 使用docker部署lnmp