您好,登錄后才能下訂單哦!
1、FROM:構建鏡像基于哪個鏡像
例如:FROM centos
2、MAINTAINER:鏡像維護者姓名或郵箱地址
例如:MAINTAINER Sun qiu ming
3、RUN:構建鏡像時運行的shell命令
例如:
RUN [ "yum","install","httpd"]
RUN yum -y install httpd
4、CMD:運行容器時執行的shell命令
例如:
CMD ["/bin/bash"]
5、EXPOSE聲明容器的服務端口
例如:EXPOSE 80 443
EXPOSE 聲明端口
格式為 EXPOSE <端口1> [<端口2>...]。
EXPOSE 指令是聲明運行時容器提供服務端口,這只是一個聲明,在運行時并不會因為這個聲明應用就會開啟這個端口的服務。在 Dockerfile 中寫入這樣的聲明有兩個好處,一個是幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射;另一個用處則是在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。
要將 EXPOSE 和在運行時使用 -p <宿主端口>:<容器端口> 區分開來。-p,是映射宿主端口和容器端口,換句話說,就是將容器的對應端口服務公開給外界訪問,而 EXPOSE 僅僅是聲明容器打算使用什么端口而已,并不會自動在宿主進行端口映射。
6、ENV : 設置容器環境變量
例如:ENV MYSQL_ROOT_PASSWORD 123.com
7、ADD:拷貝文件或目錄到鏡像,如果是URL或壓縮包會自動下載或自動解壓
ADD <源文件> ...<目的目錄>
ADD ["源文件"..."目的目錄"]
例如:
ADD https://xxx.com/html.tar.gz /var/www/html
ADD html.tar.gz /var/www/html
8、COPY :拷貝文件或目錄到鏡像容器內,跟ADD類似,但不具備自動下載或解壓功能
例如:COPY ./start.sh /start.sh
9、ENTRYPOINT:運行容器是執行的shell命令
例如:
ENTRYPOINT ["/bin/bash","-c","/start.sh"]
ENTRYPOINT /bin/bash -c '/start.sh'
10、VOLUME:指定容器掛載點到宿主機自動生成的目錄或其他容器
例如:
VOLUME ["/var/lib/mysql"]
11、USER :為RUN、CMD、和ENTRYPOINT執行命令指定運行用戶
USER <user>[:<group>] OR USER <UID>[:<GID>]
例如:
USER sunpengjun
12、WORKDIR:為RUN、CMD、ENTRYPOINT、COPY和ADD設置工作目錄
例如:
WORKDIR /data
13、HEALTHCHECK:健康檢查
14、ARG:構建時指定一些參數
例如:
FROM centos
ARG user
USER $user
注意
1、RUN在building時運行,可以寫多條
2、CMD和ENTRYPOINT在運行container時運行,只能寫一條,如果寫多條,最后一條生效。
3、CMD在run時可以被COMMAND覆蓋,ENTRYPOINT不會被COMMAND覆蓋,但可以指定--entrypoint覆蓋。
如果在相同層中,需要用到之前緩存過的鏡像,就無需重新下載。但如果此鏡像層上層發生變化,即使是在相同層,也用不了緩存。如果非要不使用緩存可以加上--no-cache參數。
Dockerfile 中每一個指令都會創建一個鏡像層,上層是依賴于下層的。無論什么時候,只要某一層發生變化,其上面所有層的緩存都會失效。
也就是說,如果我們改變 Dockerfile 指令的執行順序,或者修改或添加指令,都會使緩存失效。
通過dockerfile制作鏡像,能夠很明顯的看到鏡像每一層的操作,安全性高,并且可移植操作性強。
提示:需要事先將nginx,php,mysql所需的安裝包下載到本地(結構目錄如下)。
1,解決容器固定ip地址問題:
保證容器重啟后,ip地址不會改變,且方便管理和操作。
1)自定義網絡:
[root@sqm-docker01 nginx]# docker network create -d bridge --subnet 172.16.10.0/24 --gateway 172.16.10.1 mynet1
2,創建掛載目錄:
網頁根目錄:/wwwroot
配置文件目錄:/docker_conf
[root@sqm-docker01 nginx]# mkdir /wwwroot
[root@sqm-docker01 nginx]# mkdir /docker_conf
[root@sqm-docker01 ~]# vim Dockerfile
代碼如下:
FROM centos:7
ADD nginx-1.8.0.tar.gz /
ADD nginx-sticky-module.zip /
ADD ngx_cache_purge-2.3.tar.gz /
RUN yum -y install gcc* pcre-devel openssl-devel zlib-devel unzip make vim net-tools elinks tree \
&& groupadd nginx \
&& useradd nginx -g nginx -s /sbin/nologin
WORKDIR nginx-1.8.0/
RUN ./configure --prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module \
--with-http_realip_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/tmp/nginx/client \
--http-proxy-temp-path=/var/tmp/nginx/proxy \
--http-fastcgi-temp-path=/var/tmp/nginx/fcgi \
--with-pcre \
--add-module=../ngx_cache_purge-2.3 \
--with-http_flv_module \
&& make && make install \
&& ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ \
&& mkdir -p /var/tmp/nginx/client/ \
&& chown -R nginx /var/tmp/nginx/client/ \
&& sed -i -e 's/nobody/nginx/' -e '2s/^#//' /usr/local/nginx/conf/nginx.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]
//構建nginx鏡像:[root@sqm-docker01 nginx]# docker build -t nginx .
注意:名稱不能有大寫及特殊字符,最后的.表示在當前目錄下的dockerfile文件,且一個目錄下只能存在一個dockerfile。
//運行nginx容器:
[root@sqm-docker01 mysql]# docker run -itd --name nginx1.8.0 --network mynet1 --ip 172.16.10.10 --restart=always -p 80:80 nginx
[root@sqm-docker01 php]# vim Dockerfile
代碼如下:
FROM centos:7
ADD libmcrypt-2.5.7.tar.gz /
ADD php-5.6.27.tar.gz /
RUN yum -y install gcc* pcre-devel zlib-devel tree unzip make vim net-tools elinks libxml2-devel libcurl-devel openssl-devel bzip2-devel
WORKDIR /libmcrypt-2.5.7/
RUN ./configure --prefix=/usr/local/libmcrypt && make && make install \
&& cd /php-5.6.27 \
&& ./configure --prefix=/usr/local/php5.6 --with-mysql=mysqlnd \
--with-pdo-mysql=mysqlnd \
--with-mysqli=mysqlnd \
--with-openssl \
--enable-fpm \
--enable-sockets \
--enable-sysvshm \
--enable-mbstring \
--with-freetype-dir \
--with-jpeg-dir \
--with-png-dir \
--with-zlib \
--with-libxml-dir=/usr \
--enable-xml \
--with-mhash \
--with-mcrypt=/usr/local/libmcrypt \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--with-bz2 --enable-maintainer-zts \
&& make && make install \
&& cp php.ini-production /etc/php.ini \
&& cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm \
&& chmod +x /etc/init.d/php-fpm \
&& chkconfig --add php-fpm \
&& chkconfig php-fpm on \
&& cp /usr/local/php5.6/etc/php-fpm.conf.default /usr/local/php5.6/etc/php-fpm.conf \
&& sed -i -e 's/;daemonize = yes/daemonize = no/g' -e 's/127.0.0.1/0.0.0.0/g' /usr/local/php5.6/etc/php-fpm.conf
EXPOSE 9000
CMD ["/usr/local/php5.6/sbin/php-fpm","-c","/usr/local/php5.6/etc/php-fpm.conf"]
//構建php-fpm鏡像:[root@sqm-docker01 php]# docker build -t php-fpm .
//運行php容器:
[root@sqm-docker01 mysql]# docker run -itd --name php-fpm --network mynet1 --ip 172.16.10.20 --restart=always -p 9000:9000 php-fpm
[root@sqm-docker01 mysql]# vim Dockerfile
代碼如下:
FROM centos:7
RUN yum -y install gcc* zlib-devel make vim net-tools cmake bison ncurses-devel gcc gcc-c++ pcre pcre-devel openssl openssl-devel libaio initscripts
ADD boost_1_59_0.tar.gz /opt
ADD mysql-5.7.28.tar.gz /opt
WORKDIR /opt/mysql-5.7.28
RUN cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7.28 \
-DWITH_BOOST=/opt/boost_1_59_0 \
-DMYSQL_UNIX_ADDR=/data/mysql/tmp/mysql.sock \
-DMYSQL_DATADIR=/data/mysql \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_EXTRA_CHARSETS=all \
-DWITH_MYISAM_STORAGE_ENGINE=1 \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DWITH_MEMORY_STORAGE_ENGINE=1 \
-DWITH_READLINE=1 \
-DWITH_INNODB_MEMCACHED=1 \
-DWITH_DEBUG=OFF \
-DWITH_ZLIB=bundled \
-DENABLED_LOCAL_INFILE=1 \
-DENABLED_PROFILING=ON \
-DMYSQL_MAINTAINER_MODE=OFF \
-DMYSQL_TCP_PORT=3306 \
&& make && make install
RUN ln -s /usr/local/mysql-5.7.28 /usr/local/mysql \
&& echo "export PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile \
&& echo "export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH" >> /etc/profile \
&& source /etc/profile \
&& mkdir -p /data/mysql/{data,tmp,logs,pids,share} \
&& touch /data/mysql/logs/mysqld.log \
&& touch /data/mysql/pids/mysqld.pid \
&& useradd -s /sbin/nologin -M mysql \
&& chown -R mysql:mysql /data/mysql
COPY my.cnf /etc/my.cnf
RUN cd /usr/local/mysql \
&& cp support-files/mysql.server /etc/init.d/mysqld \
&& chmod a+x /etc/init.d/mysqld \
&& chkconfig --add mysqld \
&& chkconfig mysqld on \
&& ln -s /usr/local/mysql/bin/* /usr/local/bin \
&& mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql/data
COPY mysql-start.sh /opt
COPY user.sh /opt
RUN chmod a+x /opt/mysql-start.sh \
&& chmod a+x /opt/user.sh
EXPOSE 3306
CMD ["/opt/mysql-start.sh"]
##dockerfile中的腳本代碼如下:
[root@sqm-docker01 mysql]# cat my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_general_ci
datadir=/data/mysql/data
socket=/data/mysql/tmp/mysql.sock
[mysqld_safe]
log-error=/data/mysql/logs/mysqld.log
pid-file=/data/mysql/pids/mysqld.pid
[client]
default-character-set=utf8mb4
[root@sqm-docker01 mysql]# cat mysql-start.sh
#!/bin/bash
chown -R mysql:mysql /data/mysql
/sbin/service mysqld start
/bin/bash #保留一個終端,防止容器自動退出
//修改數據庫密碼并授權用戶:
[root@sqm-docker01 mysql]# cat user.sh
#!/bin/bash
mysqlpwd=` grep password /data/mysql/logs/mysqld.log | awk -F 'root@localhost: ' '{print $2}'`
mysql -uroot -p${mysqlpwd} -e 'alter user root@localhost identified by"pwd@123"' --connect-expired-password
mysql -u root -ppwd@123 <<EOF
create database mysqldb;
grant all on mysqldb.* to user1@'%' identified by '123.com';
EOF
###構建mysql鏡像:[root@sqm-docker01 mysql]# docker build -t mysql .
//運行mysql容器:[root@sqm-docker01 mysql]# docker run -itd --name mysql5.7.28 --network mynet1 --ip 172.16.10.30 --restart=always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=pwd@123 mysql
//執行容器中的腳本(修改數據庫密碼)[root@sqm-docker01 mysql]# docker exec mysql5.7.28 sh /opt/user.sh
//測試登陸mysql數據庫:
用user1用戶進行測試,因為root用戶我只設置了允許mysql服務器本機登陸,其他主機沒有權限。(需要在dockerhost上下載mysql客戶端)
[root@sqm-docker01 mysql]# yum -y install mysql
[root@sqm-docker01 mysql]# mysql -u user1 -p123.com -h 127.0.0.1 -P 3306
1)修改nginx配置文件:
將nginx存放配置文件的目錄copy到dockerhost:
[root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/conf /docker_conf/
[root@sqm-docker01 conf]# vim nginx.conf
修改內容如下:
2)創建測試解析php的網頁:
同樣將nginx的網頁目錄拷貝到主機:
[root@sqm-docker01 ~]# docker cp nginx1.8.0:/usr/local/nginx/html /wwwroot/
[root@sqm-docker01 ~]# cd /wwwroot/html/
[root@sqm-docker01 html]# cat > test.php <<EOF
> <?php
> phpinfo();
> ?>
> EOF
3)將dockerhost上的目錄掛載到容器內:
//我們需要將nginx和php容器刪除掉,重新運行并且掛載,其實在上邊構建完服務,不用先運行服務,可以現在運行,我是為了測試是否安裝成功。當然你也可以從一開始就可以編寫好網頁文件,直接掛載。
[root@sqm-docker01 html]# docker rm -f nginx1.8.0
[root@sqm-docker01 html]# docker run -itd --name nginx1.8.0 --network mynet1 \
> --ip 172.16.10.10 --restart=always -p 80:80 \
> -v /docker_conf/conf/:/usr/local/nginx/conf/ -v /wwwroot/html/:/usr/local/nginx/html nginx
[root@sqm-docker01 ~]# docker rm -f php-fpm
[root@sqm-docker01 ~]# docker run -itd --name php-fpm --network mynet1 \
> --ip 172.16.10.20 --restart=always -p 9000:9000 \
> -v /wwwroot/html/:/usr/local/nginx/html/ php-fpm
1)下載wordpress安裝包到網頁根目錄下:
[root@sqm-docker01 ~]# cd /wwwroot/html/
[root@sqm-docker01 html]# wget https://cn.wordpress.org/wordpress-4.7.4-zh_CN.tar.gz
//下載完,將安裝包進行解壓:
[root@sqm-docker01 html]# tar zxf wordpress-4.7.4-zh_CN.tar.gz
URL:http://容器宿主機IP/wordpress
登陸成功,lnmp搭建完畢。。。。。。。。
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。