在不經意之間,瞭解到了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%,所以需要做做筆記,把書裏的知識轉化成自己的知識。