欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

從零開始構(gòu)建docker基礎(chǔ)鏡像的方法

 更新時間:2018年03月07日 09:29:36   作者:風(fēng)雨咒之無上密籍  
這篇文章主要介紹了從零開始構(gòu)建docker基礎(chǔ)鏡像的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

段子

今年基本已經(jīng)結(jié)束了,我問了很多朋友今年掙錢了沒?大多朋友都有掙,而且掙得五花八門:有掙個屁的,有掙個錘子的,有掙個毛的,更有甚者掙個妹的,奢侈之極!最恐怖的是掙個鬼的!有的還可以,掙個球,下午我碰見一朋友,問今年掙了嗎?他望著天空喃喃自語:掙個鳥!看吧,只要肯努力,什么都能掙到。

年末將至,忽然發(fā)現(xiàn),從創(chuàng)建開始到現(xiàn)在,整整一年時間,沒有寫過多少東西。為了留下一點(diǎn)痕跡,也是為了整理一下自己的收獲,為17年畫上一筆濃郁的色彩。

最近在看一本入門級機(jī)器學(xué)習(xí)的書,里面的案例基本上是python實(shí)現(xiàn)的,所以想搭建python相關(guān)的環(huán)境,然后又想偷懶,有一個運(yùn)行環(huán)境,可以輕松安裝和編寫使用,也可以在其他地方使用,編寫工具首選jupyter notebook,當(dāng)然,在大多數(shù)的書中也是比較推薦這個工具,自己之前也使用過,覺得不錯。還有個問題就是想在其他地方使用python環(huán)境和這個工具,不需要重復(fù)安裝,此刻,我想到的是docker。之前對docker只是簡單的理解,為此,特意學(xué)習(xí)了一下docker,現(xiàn)做分享。

上圖就是docker的圖標(biāo),這個圖標(biāo)對docker的含義闡釋的還是比較全面:小鯨魚代表的是船,船上的就是集裝箱,所有的東西不管是什么,只要裝在集裝箱中,就可以方便的運(yùn)輸。docker公司的口號是Build,Ship,and Run Any App,Anywhere。docker的本意是碼頭工人,而在這里說是集裝箱的話,比較貼切。所有需要運(yùn)行的環(huán)境和程序,裝入docker,然后需要運(yùn)行的時候,就運(yùn)行這個特定的docker容器,提供特定的服務(wù)。

docker的通俗解析:點(diǎn)擊這里

剛開始的時候,搞不清楚docker和虛擬機(jī)有什么區(qū)別,總感覺docker能干的事虛擬機(jī)也能,并且在使用的時候,總按照虛擬機(jī)的操作思路去做。那docker為什么會出現(xiàn)?

我在docker的官方網(wǎng)站找到了兩張關(guān)于虛擬機(jī)和容器的區(qū)別:

容器 VS 虛擬機(jī)

容器和虛擬機(jī)具有相似的資源隔離和分配優(yōu)勢,但功能有所不同,因?yàn)槿萜魈摂M化的是操作系統(tǒng),而不是硬件,因此容器更容易移植,效率也更高。

關(guān)于容器:點(diǎn)擊這里

對于docker做了簡單的了解之后,就需要實(shí)際去體驗(yàn)一下安裝和構(gòu)建容器,本例使用centos6.5:

1.安裝docker相關(guān)軟件

[root@bogon ubuntu-16.04]# rpm -ivh http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
Retrieving http://dl.Fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
warning: /var/tmp/rpm-tmp.KYucBm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...    ########################################### [100%]
 1:epel-release   ########################################### [100%]
[root@bogon ubuntu-16.04]# yum -y install docker-io
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
...

Complete!
[root@bogon ubuntu-16.04]# service docker start
Starting cgconfig service:         [ OK ]
Starting docker:          [ OK ]
[root@bogon ubuntu-16.04]# chkconfig docker on
[root@bogon ubuntu-16.04]#

使用service docker status查看docker服務(wù)狀態(tài)的時候,發(fā)現(xiàn)沒有啟動docker dead but pid file exists,執(zhí)行docker相關(guān)命令(如docker ps)的時候會出現(xiàn)Cannot connect to the Docker daemon. Is 'docker -d' running on this host?,需要解決這個問題,如下:

[root@bogon ubuntu-16.04]# service docker status
docker dead but pid file exists
[root@bogon ubuntu-16.04]#yum-config-manager --enable public_ol6_latest
Loaded plugins: fastestmirror, refresh-packagekit
[root@bogon ubuntu-16.04]# yum install -y device-mapper-event-libs
Loaded plugins: fastestmirror, refresh-packagekit, security
...

2.構(gòu)建基礎(chǔ)鏡像

在使用docker的時候后,可以通過命令docker pull <鏡像名稱>從鏡像庫中獲取,但是有時候會出現(xiàn)網(wǎng)絡(luò)問題或是其他原因,導(dǎo)致無法拉取,在docker中國官網(wǎng)介紹使用通過 Docker 官方鏡像加速來解決無法拉?。?/p>

您可以使用以下命令直接從該鏡像加速地址進(jìn)行拉?。?/p>

$ docker pull registry.docker-cn.com/myname/myrepo:mytag

例如:

$ docker pull registry.docker-cn.com/library/ubuntu:16.04

原文如下:點(diǎn)擊這里

而在本文中,我使用Dockerfile來構(gòu)建基礎(chǔ)鏡像ubuntu 16.04(xenial),其對應(yīng)的Dockerfile的Github地址為:點(diǎn)擊這里,搜索方式為在hub.docker.com中搜索ubuntu,即可看見對應(yīng)的鏡像信息。Dockerfile內(nèi)容如下:

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /

# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L40-L48
	&& echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
	&& echo 'exit 101' >> /usr/sbin/policy-rc.d \
	&& chmod +x /usr/sbin/policy-rc.d \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L54-L56
	&& dpkg-divert --local --rename --add /sbin/initctl \
	&& cp -a /usr/sbin/policy-rc.d /sbin/initctl \
	&& sed -i 's/^exit.*/exit 0/' /sbin/initctl \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L71-L78
	&& echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L85-L105
	&& echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
	&& echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
	&& echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L109-L115
	&& echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L118-L130
	&& echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
	\
# https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap#L134-L151
	&& echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

# delete all the apt list files since they're big and get stale quickly
RUN rm -rf /var/lib/apt/lists/*
# this forces "apt-get update" in dependent images, which is also good

# enable the universe
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list

# make systemd-detect-virt return "docker"
# See: https://github.com/systemd/systemd/blob/aa0c34279ee40bce2f9681b496922dedbadfca19/src/basic/virt.c#L434
RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container

# overwrite this with 'CMD []' in a dependent Dockerfile
CMD ["/bin/bash"]

現(xiàn)在對Dockerfile中的相關(guān)命令解釋一下:

  1. FROM 指的是依賴的基礎(chǔ)鏡像,如scratch表示的是空白的,從零開始的。依賴的鏡像可以是本地的,也可以是遠(yuǎn)程庫的
  2. ADD 指的是添加本地文件到鏡像中,如果遇到linux可解壓格式文件,會自動解壓,這就是為什么整個文件中沒有對tar.gz進(jìn)行顯式解壓
  3. RUN 運(yùn)行命令,如安裝軟件的相關(guān)命令
  4. CMD 設(shè)置啟動Container時默認(rèn)執(zhí)行的命令,這個可以在啟動容器時覆蓋

目前,這個Dockerfile中涉及的命令就這幾個,其他等以后遇到再進(jìn)行說明。解釋完畢,開始構(gòu)建:

[root@bogon ubuntu-16.04]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
[root@bogon ubuntu-16.04]# docker images
REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE
[root@bogon ubuntu-16.04]# pwd
/home/ml/ubuntu-16.04
[root@bogon ubuntu-16.04]# ll -h
total 40M
-rw-rw-r--. 1 ml ml 2.8K Dec 19 12:37 Dockerfile
-rw-rw-r--. 1 ml ml 40M Dec 19 12:39 ubuntu-xenial-core-cloudimg-amd64-root.tar.gz
[root@bogon ubuntu-16.04]# 
[root@bogon ubuntu-16.04]# docker build -t ubuntu:16.04 .
Sending build context to Docker daemon 41.94 MB
Sending build context to Docker daemon 
Step 0 : FROM scratch
 ---> 
Step 1 : ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
 ---> 537c2f6dd023
Removing intermediate container dee7679a7ee2
Step 2 : RUN set -xe && echo '#!/bin/sh' > /usr/sbin/policy-rc.d && \
echo 'exit 101' >> /usr/sbin/policy-rc.d && chmod +x /usr/sbin/policy-rc.d && \
dpkg-divert --local --rename --add /sbin/initctl && cp -a /usr/sbin/policy-rc.d /sbin/initctl  && sed -i 's/^exit.*/exit 0/' /sbin/initctl && \
 ...---> Running in 41d719b68981
+ echo #!/bin/sh
+ echo exit 101
+ chmod +x /usr/sbin/policy-rc.d
+ dpkg-divert --local --rename --add /sbin/initctl
Adding 'local diversion of /sbin/initctl to /sbin/initctl.distrib'
+ cp -a /usr/sbin/policy-rc.d /sbin/initctl
+ sed -i s/^exit.*/exit 0/ /sbin/initctl
+ echo force-unsafe-io
+ echo DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
+ echo APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };
+ echo Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";
+ echo Acquire::Languages "none";
+ echo Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";
+ echo Apt::AutoRemove::SuggestsImportant "false";
 ---> c49bdbf61888
Removing intermediate container 41d719b68981
Step 3 : RUN rm -rf /var/lib/apt/lists/*
 ---> Running in 6389964016a2
 ---> 4508181f7442
Removing intermediate container 6389964016a2
Step 4 : RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
 ---> Running in cbed2b28c988
 ---> 8eed06df8f19
Removing intermediate container cbed2b28c988
Step 5 : RUN mkdir -p /run/systemd && echo 'docker' > /run/systemd/container
 ---> Running in aff40dbc6e05
 ---> 19c96e7912a4
Removing intermediate container aff40dbc6e05
Step 6 : CMD /bin/bash
 ---> Running in 2469ee9d7251
 ---> 77e565a65647
Removing intermediate container 2469ee9d7251
Successfully built 77e565a65647
[root@bogon ubuntu-16.04]# docker images 
REPOSITORY   TAG     IMAGE ID   CREATED    VIRTUAL SIZE
ubuntu    16.04    77e565a65647  33 seconds ago  110.5 MB
[root@bogon ubuntu-16.04]#

從構(gòu)建日志可以看出,每條命令為一個step,執(zhí)行完成之后會產(chǎn)生一個id,類似于6389964016a2,其實(shí),這就是鏡像的分層,一層層堆積在一起。

到此,一個ubuntu16.04版的docker鏡像構(gòu)建完成,那么接下來就是運(yùn)行

3.運(yùn)行鏡像

使用docker run命令運(yùn)行:

[root@bogon ubuntu-16.04]# docker run -it ubuntu:16.04
root@5ea0b95e8641:/# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

root@5ea0b95e8641:/# ps -ef
UID   PID PPID C STIME TTY   TIME CMD
root   1  0 0 22:47 ?  00:00:00 /bin/bash
root   11  1 0 22:47 ?  00:00:00 ps -ef
root@5ea0b95e8641:/#

其中5ea0b95e8641為當(dāng)前容器的ID,進(jìn)入容器查看所有進(jìn)程,pid為1的時bash,linux不應(yīng)該時init嗎?其實(shí),這就是容器與虛擬機(jī)的差別,容器的init進(jìn)程就是主機(jī)上docker服務(wù)進(jìn)程,每個容器只是一個進(jìn)程而已。其中的參數(shù)-it指的是前端打開并分配一個終端,-d為在后臺運(yùn)行,我們試試當(dāng)前這個可不可以使用-d:

[root@bogon ~]# docker run -d ubuntu:16.04
43ae7ded8e6920b55b8e744b52ffce37b89b25182fcacdc10a5414e6621abff3
[root@bogon ~]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
[root@bogon ~]# docker run -d ubuntu:16.04 /bin/bash
77f3ec2ebfb3f154772683eeea8ca7e2ba3b7756b1488f5f09818af424e0298e
[root@bogon ~]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES

可以明顯的開出來,使用-d后,docker ps查不到任何運(yùn)行的容器,如果使用-it的話,在別的shell下使用docker ps查看:

[root@bogon ml]# docker ps
CONTAINER ID  IMAGE    COMMAND    CREATED    STATUS    PORTS    NAMES
8341a332c788  ubuntu:16.04  "/bin/bash"   18 seconds ago  Up 18 seconds       drunk_cori 

可以看到,有容器在運(yùn)行,因?yàn)槲覀儧]有退出。由此可以看出,容器其實(shí)以進(jìn)程方式運(yùn)行,執(zhí)行完成/bin/bash之后,進(jìn)程消亡,所以容器也就不存在,如果容器里面是一個tomcat服務(wù),則是另外一種情況了。

基礎(chǔ)鏡像基本構(gòu)建完成,后面的環(huán)境搭建,都將基于這個鏡像構(gòu)建。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在Docker上安裝配置Oracle教程

    在Docker上安裝配置Oracle教程

    本篇文章主要介紹了在 Docker 上配置 Oracle教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • docker 啟動elasticsearch鏡像,掛載目錄后報錯的解決

    docker 啟動elasticsearch鏡像,掛載目錄后報錯的解決

    這篇文章主要介紹了docker 啟動 elasticsearch鏡像,掛載目錄后報錯的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-11-11
  • 為docker中的nginx配置https的方法步驟

    為docker中的nginx配置https的方法步驟

    這篇文章主要介紹了為docker中的nginx配置https的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-01-01
  • docker實(shí)現(xiàn)資源清理方式

    docker實(shí)現(xiàn)資源清理方式

    這篇文章主要介紹了docker實(shí)現(xiàn)資源清理方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • docker容器的四種端口映射演示分析

    docker容器的四種端口映射演示分析

    這篇文章主要為大家介紹了docker容器的四種端口映射演示分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • Linux環(huán)境docker部署Firefox結(jié)合內(nèi)網(wǎng)穿透遠(yuǎn)程使用瀏覽器測試的示例詳解

    Linux環(huán)境docker部署Firefox結(jié)合內(nèi)網(wǎng)穿透遠(yuǎn)程使用瀏覽器測試的示例詳解

    在Docker中打開Firefox意味著我們將在一個Docker容器中運(yùn)行Firefox瀏覽器,這對于一些特殊的測試場景非常有用,例如需要在不同版本的瀏覽器中進(jìn)行測試,下面是一個簡單的示例,演示如何在Docker中打開Firefox,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • docker firewalld 防火墻設(shè)置方式

    docker firewalld 防火墻設(shè)置方式

    在CentOS7中,Docker默認(rèn)修改防火墻配置,可能導(dǎo)致手動添加的策略失效,解決方法包括啟用firewalld,禁用Docker的iptables,并重新配置防火墻策略,具體步驟包括編輯/etc/docker/daemon.json文件,重啟Docker服務(wù),以及在firewalld中設(shè)置偽裝地址和端口策略
    2024-10-10
  • Docker鏡像拉取失敗問題分析及解決方案

    Docker鏡像拉取失敗問題分析及解決方案

    在使用Docker時,我們經(jīng)常需要從Docker鏡像倉庫中拉取鏡像,以便于在本地機(jī)器上運(yùn)行,下面這篇文章主要給大家介紹了關(guān)于Docker鏡像拉取失敗問題分析及解決方案,需要的朋友可以參考下
    2024-08-08
  • Docker安裝MongoDB并使用Navicat連接的操作方法

    Docker安裝MongoDB并使用Navicat連接的操作方法

    MongoDB是一個基于分布式文件存儲的數(shù)據(jù)庫,MongoDB最大的特點(diǎn)是它支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,這篇文章主要介紹了Docker安裝MongoDB并使用Navicat連接,需要的朋友可以參考下
    2022-10-10
  • Docker部署MySQL8集群(一主二從)的實(shí)現(xiàn)步驟

    Docker部署MySQL8集群(一主二從)的實(shí)現(xiàn)步驟

    本文主要介紹了Docker部署MySQL8集群,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論