Docker鏡像
- 一、Docker鏡像的分層
- 二、Docker鏡像的創建
- 1、Docker鏡像
- 2、Docker鏡像的創建方法
- 三、基于已有鏡像創建
- 四、基于本地模塊創建
- 五、基于Dockerfile創建
- 1、Dockerfile是由一組指令組成的檔案
- 2、Dockerfile結構四部分
- 3、Dockerfile操作指令
- 4、使用dockerfile創建鏡像
- (1)apache
- 創建apache目錄
- 撰寫dockerfile檔案
- 撰寫run.sh腳本
- 準備首頁
- 生成鏡像
- 運行新的鏡像容器,并通過網頁檢測
- (2)構建SSH鏡像
- 創建SSH目錄
- 創建dockerfile檔案
- 生成鏡像
- 啟動容器并登錄
- (3)構建systemctl鏡像
- 創建systemctl目錄
- 創建dockerfile
- 構建鏡像
- 進入容器
- 測驗
- (4)制作nginx鏡像
- (5)制作tomcat鏡像
- (6)制作mysql鏡像
一、Docker鏡像的分層

二、Docker鏡像的創建
1、Docker鏡像
(1)應用發布的標準格式
(2)支撐一個Docker容器的運行
2、Docker鏡像的創建方法
(1)基于已有鏡像創建
(2)基于本地模板創建
(3)基于Dockerfile創建
三、基于已有鏡像創建
1、將容器里面運行的程式及運行環境打包生成新的鏡像
docker commit [選項] 容器ID/名稱 倉庫名稱:[標簽]
-m 說明資訊
-a 作者資訊
-p 生成程序中停止容器的運行
2、具體實驗操作
創建容器
docker create -it centos:7 /bin/bash
docker commit -m "new" -a "daoke" be93f7652231 daoke:test
docker images

四、基于本地模塊創建
1、通過匯入作業系統模板檔案生成新的鏡像
2、使用wget命令匯入為本地鏡像
wget
http://download.openvz.org/template/precreated/debian-7.0-x86-minimal.tar.gz
3、匯入成功后可查看本地鏡像訊息
docker imagges |grep new
五、基于Dockerfile創建
1、Dockerfile是由一組指令組成的檔案
2、Dockerfile結構四部分
(1)基礎鏡像資訊
(2)維護者資訊
(3)鏡像操作指令
(4)容器啟動時執行指令
注:Dockerfile每行支持一條指令,每條指令可攜帶多個引數,支持使用一“#”號開頭的注釋,
3、Dockerfile操作指令
| 指令 | 含義 |
|---|---|
| FROM鏡像 | 指定新鏡像所基于的鏡像,第一條指令必須為FROM指令,每創建一個鏡像就需要一條FROM指令 |
| MAINTAINER名字 | 說明新鏡像的維護人資訊 |
| RUN命令 | 在所基于的鏡像上執行命令,并提交到新的鏡像中 |
| CMD[“要運行的程式”,“引數1”,“引數2”] | 指令啟動容器時要運行的命令或者腳本,Dockerfile只能有一條CMD命令,如果指定多條則只能最后一條被執行 |
| EXPOSE埠號 | 指定新鏡像加載到Docker時要開啟的埠 |
| ENV環境變數 變數值 | 設定一個環境變數的值,會被后面的RUN使用 |
| ADD 源檔案/目錄 目標檔案/目錄 | 將源檔案復制到目標檔案,源檔案要與Dockerfile位于相同目錄中,或者是一個URL |
| COPY 源檔案/目錄 目標檔案/目錄 | 將本地主機上的檔案/目錄復制到目標地點,源檔案/目錄要與Dockerfile在相同的目錄中 |
| VOLUME [ “目錄”] | 在容器中創建一個掛載點 |
| USER用戶/UID | 指定運行容器時的用戶 |
| WORKDIR路徑 | 為后續的RUN、CMD、ENTRYPOINT指定作業目錄 |
| ONBUILD命令 | 指定所生成的鏡像作為一個基礎鏡像時所要運行命令 |
| HEALTHCHECK | 健康檢查 |
4、使用dockerfile創建鏡像
(1)apache
創建apache目錄
mkdir apache
cd apache

撰寫dockerfile檔案
vim dockerfile
#基于基礎鏡像
From centos:7
#維護鏡像的用戶資訊
MAINTAINER this is test
#鏡像的操作指令:安裝apache軟體
RUN yum -y install httpd
#開啟80埠
EXPOSE 80
#復制網站首頁檔案
ADD index.html /var/www/html/index.html
#執行腳本并復制到鏡像中
ADD run.sh /run.sh
RUN chmod 777 /run.sh
#啟動容器時執行腳本
CMD ["/run.sh"]

撰寫run.sh腳本
vim run.sh
#!/bin/bash
rm -rf /run/httpd/*
exec /usr/sbin/apachectl -D FOREGROUND

準備首頁
echo "this is 17team web" >index.html
生成鏡像
docker build -t httpd:centos . #末尾別忘記“.”

運行新的鏡像容器,并通過網頁檢測
docker run -d -P httpd:centos #-P隨機埠
docker run -d -p 1213 httpd:centos #-p指定埠

##使用瀏覽器輸入:192.168.177.33:xxxx

(2)構建SSH鏡像
創建SSH目錄
mkdir sshd
cd sshd

創建dockerfile檔案
vim dockerfile
FROM centos:7
MAINTAINER ssh_test
RUN yum -y install openssh* net-tools lsof telnet passwd
RUN echo "123123" | passwd --stdin root
RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config
RUN ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key
RUN sed -i '/^session\s\+required\s\+pam_loginuid.so/s/^/#/' /etc/pam.d/sshd
RUN mkdir -p /root/.ssh && chown root:root /root && chmod 700 /root/.ssh
EXPOSE 22
CMD ["/usr/sbin/sshd","-D"]

生成鏡像
docker build -t sshd:new .

啟動容器并登錄
docker run -d -P sshd:new
ssh localhost -p xxxx

(3)構建systemctl鏡像
創建systemctl目錄
mkdir systemctl
cd systemctl

創建dockerfile
vim Dockerfile
FROM sshd:new
ENV container docker
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/*;
VOLUME ["/sys/fs/cgroup"]
CMD ["/usr/sbin/init"]

構建鏡像
docker build -t systemd:new .
privateged container 內的root擁有真正的root權限,否則,container內的root只是外部的一個普通用戶權限
docker run --privateged -it -v /sys/fs/cgroup:/sys/fs/cgroup:ro systemd:new /sbin/init &
進入容器
docker exec -it 容器id bash
測驗
systemctl status sshd
(4)制作nginx鏡像
創建nginx目錄
mkdir nginx
cd nginx
創建dockerfile檔案
vim Dockerfile
FROM centos:7
MAINTAINER test
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.0.tar.gz /usr/local/src
WORKDIR /usr/local/src/nginx-1.12.0
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:&PATH
EXPOSE 80
EXPOSE 443
RUN echo "daemon off;" >>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 777 /run.sh
CMD ["/run.sh"]
創建啟動腳本
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
創建新鏡像及測驗
docker build -t nginx:new
docker run -d -P nginx:new
192.168.177.8:xxxx
(5)制作tomcat鏡像
創建tomcat目錄
mkdir tomcat
cd tomcat
創建dockerfile檔案
vim Dockerfile
FROM centos:7
MAINTAINER test
ADD jdk-8u91-linux-x64.tar.gz /opt
ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
RUN mv /opt/jdk1.8.0_91 /usr/local/java
RUN mv /usr/local/src/apache-tomcat-9.0.16 /usr/local/tomcat
ENV JAVA_HOME /usr/local/java
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
制作鏡像
docker buil -t tomcat:test .
運行容器并在瀏覽器中訪問
docker run -d -P tomcat:test
192.168.177.8:49152
(6)制作mysql鏡像
創建mysql目錄
mkdir mysql
cd mysql
創建my.cnf檔案
vim Dockerfile
FROM centos:7
MAINTAINER test
ADD jdk-8u91-linux-x64.tar.gz /opt
ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
RUN mv /opt/jdk1.8.0_91 /usr/local/java
RUN mv /usr/local/src/apache-tomcat-9.0.16 /usr/local/tomcat
ENV JAVA_HOME /usr/local/java
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
創建dockerfile檔案
vim Dockerfile
FROM centos:7
MAINTAINER this is test
RUN yum -y install ncurses ncurses-devel bison cmake gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin mysql
ADD mysql-boost-5.7.20.tar.gz /usr/local/src
WORKDIR /usr/local/src/mysql-5.7.20
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 -j2 && make install
RUN chown -R mysql:mysql /usr/local/mysql
RUN rm -rf /etc/my.cnf
ADD my.cnf /etc
RUN chown mysql:mysql /etc/my.cnf
ENV PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH
WORKDIR /usr/local/mysql
RUN bin/mysqld \
--initialize-insecure \
--user=mysql \
--basedir=/usr/local/mysql \
--datadir=/usr/local/mysql/data
RUN cp /usr/local/mysql/usr/lib/systemd/system/mysqld.service /usr/lib/systemd/system/
EXPOSE 3306
RUN echo -e "#!/bin/sh \nsystemctl enable mysqld" > /run.sh
RUN chmod 755 /run.sh
RUN sh /run.sh
CMD ["init"]
制作鏡像
docker build -t mysql:new .
啟動容器
docker run --name=mysql_server -d -P --privileged mysql:new
進入容器給權限
grant all privileges on *.* 'root' @ '%' identified by 'abc123';
grant all privileges on *.* 'root' @ 'localhost' identified by 'abc123';
在宿主機系統安裝mairadb客戶端連接mysql容器
mysql -h 192.168.177.8 -u root -P xxxx -pabc123
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/271281.html
標籤:其他
上一篇:Docker——四種網路模式決議
