參考文章:https://www.jianshu.com/p/dc4cd0547d1e
鏡像的制作方式有兩種,一種是下載別人的鏡像之后再制作成自己的鏡像,一種是從頭開始制作自己的鏡像
第一種,下載別人的鏡像來修改。
安全起見下載官方的centos系統鏡像,在該系統內安裝nginx之后,在封裝成鏡像
下載centos系統鏡像
docker pull centos
使用鏡像啟動容器並進入容器
docker run -it --name centos.nginx centos /bin/bash
安裝epel源和nginx
yum install epel-release -y
yum install nginx -y
配置nginx為前台啟動模式
在nginx的配置文件中加入如下參數
vi /etc/nginx/nginx.conf
daemon off;
使用exit退出容器,然后使用docker commit命令制作鏡像
查看容器
docker ps -a
制作鏡像
docker commit -m "nginx" -a "centos-nginx" -c 'CMD ["/usr/sbin/nginx"]' 86ae1d7284e3 centos-nginx
-m 來指定提交的說明信息,跟我們使用的版本控制工具一樣;
-a 可以指定更新的用戶信息;之后是用來創建鏡像的容器的 ID;最后指定目標鏡像的倉庫名和 tag 信息。創建成功后會返回這個鏡像的 ID 信息;
-c 制作鏡像之后執行的命令
86ae1d7284e3 容器ID,就是希望將哪個容器重新制作
centos-nginx 制作之后的鏡像名稱
使用新鏡像啟動容器
先查看鏡像
docker images
使用新鏡像啟動容器
docker run --name nginx -p 8888:80 -d centos-nginx
--name nginx 為容器定義名稱,名稱為nginx
-p 8888:80 將宿主機的8888端口映射到容器內的80端口
-d 指定該容器在后天運行
cetnos-nginx 指定使用centos-nginx鏡像來創建容器
使用瀏覽器訪問容器內的nginx
第二種,全新制作自己的容器使用Dockerfile文件
Dockerfile是使用源代碼構建docker的鏡像,編輯一個Dockerfile,而后根據此文件制作;
docker可以自動通過讀取Dockerfile中的指令,自動構建鏡像。
Dockerfile是一個文本文檔包含所有用戶的命令,可以在命令行上調用組建一個鏡像。
使用docker build命令的用戶可以讀取docker file中的連續指令,自動構建一個鏡像。
示例使用dockerfile文件制作nginx的鏡像:
#創建工作目錄
mkdir nginx
#進入nginx目錄,創建nginx測試頁,創建dockerfile文件
cd nginx/
vim index.html
<h1> nginx test page </h1>
vim dockerfile
#dockerfile 文件內容開始
FROM centos:latest #基准鏡像
MAINTAINER "Withdocker" #作者信息
WORKDIR /usr/local/src/ #工作目錄
ENV NG_VERSION nginx-1.16.0 #定義環境變量
RUN yum -y install epel-release #安裝epel倉庫
RUN yum -y install wget && wget http://nginx.org/download/$NG_VERSION.tar.gz && tar xzvf $NG_VERSION.tar.gz #下載nginx文件並解壓
#安裝編譯依賴包
RUN yum install -y gcc gcc-c++ glibc make autoconf openssl openssl-devel && yum install -y pcre-devel libxslt-devel gd-devel GeoIP GeoIP-devel GeoIP-data
RUN yum clean all #清理倉庫
RUN useradd -M -s /sbin/nologin nginx #創建nginx用戶
WORKDIR /usr/local/src/$NG_VERSION #切換工作目錄
#編譯安裝nginx
RUN ./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --with-file-aio --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_xslt_module --with-http_image_filter_module --with-http_geoip_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_auth_request_module --with-http_random_index_module --with-http_secure_link_module --with-http_degradation_module --with-http_stub_status_module && make && make install
ADD index.html /usr/local/nginx/html #復制測試頁面到容器中
VOLUME /usr/local/nginx/html #設置容器中要掛在到宿主機的目錄
ENV PATH /usr/local/nginx/sbin:$PATH #設置sbin環境變量
EXPOSE 80/tcp #暴露80端口
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
#當ENTRYPOINT和CMD連用時,CMD的命令是ENTRYPOINT命令的參數,兩者連用相當於nginx -g "daemon off;"而當一起連用的時候命令格式最好一致(這里選擇的都是json格式的是成功的,如果都是sh模式可以試一下)
#dockerfile 文件內容結束
#構建鏡像
docker build ./ -t mynginx
#指明構建的根目錄,有dockerfile的就是構建根目錄,-t指明tag標簽,執行該命令后程序會讀取並執行dockerfile文件內的所有命令。下圖為執行成功的結果截圖。
查看鏡像
docker images
#根據構建的鏡像運行容器
docker run --name mynginx -d -p 8123:80 mynginx
#查看容器
docker ps
#訪問nginx