docker安裝、使用、dockerfile介紹

在不經意之間,瞭解到了docker,瞭解了之後,發現世界變化真快,還在我們熟悉的自己敲命令安裝linux環境的時候,別人已經設計出了一種可以不依賴具體環境的容器,科技的世界變化的挺快的,現在我們來擁抱一下科技吧。

1、docker安裝

老規矩,要使用docker必須安裝docker,不過我這裏不打算細講了,因爲之前講了很多安裝了,這裏推薦一個網站,docker官網有詳細介紹安裝的,只要按照步驟安裝即可。centos下安裝docker

1.1 介紹

打開這個網站,我們可以看到,官方介紹有3種方法安裝:
在這裏插入圖片描述

1.2 安裝

我用之前用的是第一種方法,通過倉庫安裝:
下面這些命令是設置倉庫的,就按照輸入即可
在這裏插入圖片描述

現在就到真正的安裝docker鏡像了,輸入這個命令即可:
在這裏插入圖片描述

1.3 測試

官方也推薦了測試的方法,安裝完成之後,就可以測試一下安裝是否成功。
在這裏插入圖片描述

2、docker初探

2.1 docker命令

docker的核心就是鏡像,我們會使用docker做成不同的鏡像,然後上傳到docker的服務器上,需要使用的時候就直接拉取鏡像即可。docker鏡像

我們先來查看本地的docker鏡像,hello-world是我剛剛運行的,所以會加載到本地緩存,可以刪除掉。
在這裏插入圖片描述

拉取鏡像:
我這裏拉取的是centos7的鏡像:
在這裏插入圖片描述
我們可以通過docker images來查看本地的鏡像:
在這裏插入圖片描述
這裏可以看到我們本地有兩個鏡像,其中就是我們剛剛拉下來的centos鏡像。

運行容器:
在這裏插入圖片描述
如果運行docker的時候,本地沒有這個鏡像,docker會嘗試去倉庫中拉取鏡像,就像我們運行的第一個鏡像的時候,就是從倉庫中拉取了hello-world的鏡像,centos也是,但是我們拉取的centos不是一個真正的系統,而是一個基本的文件系統,內核是跟我們虛擬機共用的。

run是啓動鏡像的命令,鏡像運行之後就變成容器
-d 命令是後臺執行,然後可以使用attach命令進入後臺運行的容器
如果是退出了容器,也是需要run再次運行

退出容器:
在這裏插入圖片描述

查看docker正在運行的容器:
在這裏插入圖片描述
目前我沒有運行容器,所以是空的

查看運行的所有容器:
在這裏插入圖片描述
這個表示着docker運行過的所有的鏡像

啓動已經停止運行的容器:
在這裏插入圖片描述
運行的的是uid。
start是運行已經停止的容器,跟上面的run不一樣
start只能運行已經停止的容器,不包括退出的容器

停止容器的命令:
在這裏插入圖片描述

重啓容器:
加粗樣式

進入容器:
在這裏插入圖片描述
這個命令進入容器,是同步的,也就是我這邊操作,另一邊也同步看到,不是很常用。這個命令好像是需要用CTRL+P+Q退出的情況下,才能進

容器不退出,返回宿主機:
有快捷鍵 CTRL+P+Q

exec命令,進入容器:

docker exec -it 8ff9032399b6 /bin/bash

這個命令進入容器比較常用,相當於創建了一個/bin/bash交互界面,不像之前的attach一樣,是同步的,這個對個線程

刪除容器:
在這裏插入圖片描述
刪除容器簡單粗暴。刪除鏡像是docker rmi i代表的是image

導出鏡像

docker export df9c17f558df > ubuntu.tar

如果需要把本地的容器導出,可以使用docker export命令,只要是方便近距離的傳輸。

導入鏡像

cat ubuntu.tar | docker import - ubuntu:v1

竟然有導出,就有導入,如果同事導出了鏡像給我,我就需要導入鏡像。

3、製作docker鏡像

3.1 dockerfile構建鏡像

構建一個新的鏡像有兩種方法,

  • 第一種是通過docker commit直接上傳鏡像,在《我的第一本docker書》中有描述,簡單的說就是手動執行命令,拉取各個軟件,等等,等到準備好了之後,進行一次docker commit,這個就有點像我們在VMware中進行備份一樣,我們打開虛擬機,然後預裝各個軟件,等軟件裝好了之後,就打包一份備份鏡像,等以後需要使用的時候,再次打開。

  • 第二種使用dockerfile來構建,就是等下要講的,這種方式比較智能,也比較通用,可以隨時編譯,然後再上傳到hub.docker中,第一種就相當於手動輸入命令。

先來看一個完整的dockerfile,準備先構建,然後再講解每一個步驟:

# This is dockerfile for nginx

# base image
FROM centos:7

# author
MAINTAINER chenguanren [email protected]

COPY CentOS-Base.repo.backup /etc/yum.repos.d/CentOS-Base.repo.backup

ADD nginx-1.13.7.tar.gz /usr/local/src/
ADD pcre-8.41.tar.gz /usr/local/src/
ADD zlib-1.2.11.tar.gz /usr/local/src/
ADD openssl-1.1.0g.tar.gz /usr/local/src/

RUN yum makecache && yum update -y
RUN yum install make automake gcc gcc-c++ kernel-devel -y

WORKDIR /usr/local/src/nginx-1.13.7

RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install

RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf

EXPOSE 80


CMD ["/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]

構建:

docker build -t="ren/nginx:v2" .

-t是指定這個鏡像的名字,構建的時候,儘量帶上標籤,說明我們構建的鏡像是哪一個版本的,:後面的就是標籤,最後還有一個點,是指定docker構建的時候,是當前目錄。

Sending build context to Docker daemon   9.08MB
Step 1/14 : FROM centos:7
 ---> 5e35e350aded
Step 2/14 : MAINTAINER chenguanren [email protected]
 ---> Using cache
 ---> 839a5d1337fa
Step 3/14 : COPY CentOS-Base.repo.backup /etc/yum.repos.d/CentOS-Base.repo.backup
 ---> Using cache
 ---> d45b5c517adc
Step 4/14 : ADD nginx-1.13.7.tar.gz /usr/local/src/
 ---> Using cache
 ---> 9226240a4344
Step 5/14 : ADD pcre-8.41.tar.gz /usr/local/src/
 ---> Using cache
 ---> b68559cd6e62
Step 6/14 : ADD zlib-1.2.11.tar.gz /usr/local/src/
 ---> Using cache
 ---> 721c96377aed
Step 7/14 : ADD openssl-1.1.0g.tar.gz /usr/local/src/
 ---> Using cache
 ---> e4bf83b558fe
Step 8/14 : RUN yum makecache && yum update -y
 ---> Using cache
 ---> 08171fbbb680
Step 9/14 : RUN yum install make automake gcc gcc-c++ kernel-devel -y
 ---> Using cache
 ---> 249750da2f44
Step 10/14 : WORKDIR /usr/local/src/nginx-1.13.7
 ---> Using cache
 ---> 1c4fe14e5884
Step 11/14 : RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install
 ---> Using cache
 ---> ee040251ea74
Step 12/14 : RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
 ---> Using cache
 ---> 799b63ae3e48
Step 13/14 : EXPOSE 80
 ---> Using cache
 ---> 72ed6216eb39
Step 14/14 : CMD ["/usr/local/nginx/sbin/nginx", "-c", "/usr/local/nginx/conf/nginx.conf"]
 ---> Using cache
 ---> 5a0cb35fb050
Successfully built 5a0cb35fb050
Successfully tagged ren/nginx:v2

看着輸出的信息,就可以看到docker是一步一步按照我們寫的dockerfile來構建的,直到構建完成之後,會生成一個新鏡像ID。

構建完成之後,可以通過docker images查看鏡像:
在這裏插入圖片描述

運行新鏡像:

docker run --name nginx-test -p 8080:80 -d ren/nginx:v2

使用這個命令就可以運行我剛剛編譯好的鏡像,-d是後臺運行,比較符合nginx作爲後臺程序運行。–name是指定運行程序的名字。

3.2 dockerfile指令

上面寫過dockerfile也編譯過,但是沒有詳細講過,現在可以單獨講解一下各個命令:

3.2.1 CMD

cmd命令是docker啓動啓動的時候運行的命令,這跟我們使用run的時候,帶的命令參數一樣

docker run -it -d 1033177205/nginx:v1 /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf

我這裏啓動nginx的時候,會去執行我後面帶的參數,/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf,也就是會啓動這個nginx的程序,這種傳參跟我們在dockerfile寫的、
CMD ["/usr/local/nginx/sbin/nginx", “-c”, “/usr/local/nginx/conf/nginx.conf”]這個是同一個意思,也就是如果不帶參數,會默認執行這個CMD命令, 但是如果帶了參數,就是把CMD中的參數覆蓋掉,這個需要執行,可以試試傳參/bin/bash就可以知道,這時候就不會啓動nginx了

dockerfile默認只支持一個CMD的,如果寫了多個CMD.,只會執行最後一個CMD

3.2.2 ENTRYPOINT

ENTRYPOINT這個倒是有點像內置命令,我們修改一個dockerfile

ENTRYPOINT ["/usr/local/nginx/sbin/nginx"]

然後重新構建,運行的時候,我們輸入如下命令:

docker run -it -d 1033177205/nginx:v1 -c /usr/local/nginx/conf/nginx.conf

docker會把後面的參數傳給ENTRYPOINT ,也就是在鏡像中,最終運行的命令是:
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
相等於我指定了內置命令,參數還是可以通過外部傳參進來

3.2.3 WORKDIR

看着單詞就是說工作目錄,

WORKDIR /usr/local/src/nginx-1.13.7

RUN ./configure --prefix=/usr/local/nginx --with-http_realip_module --with-http_addition_module --with-http_gzip_static_module --with-http_secure_link_module --with-http_stub_status_module --with-stream --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.0g && make && make install

dockerfile的使用到工作目錄,我們這裏先指定一個工作目錄,這個工作目錄下,
在這裏插入圖片描述
就有我們用的軟件,所以這時候,我們就目錄就在/usr/local/src/nginx-1.13.7下,所以直接./configure執行我們需要配置的命令即可。

還有一點是我們進入容器的時候,都會默認進入這個WORKDIR路徑下,可以通過命令切換工作路徑,-w 路徑,就可以切換了。

3.2.4 ENV

ENV指令是用來在鏡像構建過程中設置環境變量,這個環境變量也會在構建後的容器中生效,像是系統的一個環境變量的感覺。

ENV TARGET_DIR /opt/app
WORKDIR $TARGET_DIR 

可以在運行的時候通過-e 來傳遞環境變量的值。

3.2.5 USER

USER指令用來指定該鏡像會以什麼的用戶去運行,可以通過-u覆蓋掉這個參數。

3.2.6 VOLUME

VOLUME指令用來向基於鏡像創建的容器添加捲,我們知道鏡像是不可以修改的,除非你定時commit這個鏡像,但是感覺這種做法不太好,如果是數據庫的數據,把他上傳到鏡像中,總感覺怪怪的,所以需要一個外部的掛載點,把這部分的數據掛載出去,然後鏡像還是當初的一個鏡像,沒有任何有關的數據。目前還用到,等用到的時候,具體實操一波。

3.2.7 ADD

這個命令用的最多,就是把構建環境下的文件或目錄複製到鏡像中,上面的dockerfile就有使用。

docker是根據目的地址參數的末尾字符來判斷源文件是目錄還是文件,如果地址是/結尾,就認定是一個源文件是一個目錄,否則認爲是文件

如果是壓縮文件的話,docker會自動解壓到當前文件夾,看我們做的鏡像就知道了

3.2.8 COPY

COPY和ADD比較類似,不同的是,COPY就不會去做提取和解壓的動作。

3.2.9 ONBUILD

不是很懂,用到再說

3.3 把鏡像推到docker hub上

把鏡像推到docker hub上有點坑,需要先登錄:
登錄命令:

docker login

填好賬號密碼。然後我們之前做的鏡像是需要符合一定要求的:
給自己鏡像命名的時候格式應該是: docker註冊用戶名/鏡像名,比如我的docker用戶名爲 1033177205,那麼我的鏡像tag就爲 1033177205/nginx,不然是push不上去的

推上去的命令:

docker push 1033177205/nginx:v1

可以直接查看hub.docker網站,就可以看到推上去的鏡像
在這裏插入圖片描述

從hub上拉取鏡像:

docker pull 1033177205/nginx:v1

我這裏是看了《我的第一本docker書》總結的,需要看詳細的,可以去看一下這本書,總結的意思就是隻是單純的看書,接收知識的比例不超過10%,所以需要做做筆記,把書裏的知識轉化成自己的知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章