一、簡介
Docker是一個基於go語言的開源的應用容器引擎,可以將開發者的應用及依賴包打包到一個可移植容器當中,然後發佈到任何流行的Linux機器中,可以極大的減少開發人員的工作量,Docker也可以實現虛擬化
二、Docker安裝
前提:
Docker自發布以來就變得非常火爆,目前Linux系統、windows系統和mac系統都支持docker,本文以Linux系統介紹Docker的安裝及簡單使用。
Docker的發佈時間也沒有多長時間,因此Linux對Docker的支持也有限制,僅支持64位,目前centos7已經支持docker,安裝要求系統爲64位,內核版本爲3.10以上,對於centos6,安裝要求需centos6.5或更高版本,同樣系統爲64位,docker僅支持64位,同時內核版本爲2.6.32-431 或者更高版本。
可以使用uname -a 查詢內核版本
博主的內核版本爲3.10.0-862,爲方便使用,安裝的是centos7系統,如果是centos6還需要升級內核版本,稍顯麻煩
Docker安裝:
Docker有兩個版本,Docker-ee和Docker-ce
Docker-ce是社區免費版,Docker-ee爲企業版,需要收費,本文安裝的爲Docker-ce社區免費版
安裝之前安裝相應所需包依賴
yum -y install yum-utils device-mapper-persistent-data lvm2
下載docker-ce的yum源到/etc/yum.repos.d/下
wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum安裝docker-ce
docker安裝完成,啓動docker,查看docker版本信息
systemctl start docker
Docker安裝成功
三、Docker使用
首先從最簡單的hello-world開始
運行一個hello-world容器,本地最初沒有hello-world鏡像,會自動從遠端docker hub拉取
docker run hello-world
使用docker images命令可查詢當前本地主機上的鏡像,我的機器上原來有拉取其它鏡像會有點多,看到有hello-world鏡像即爲ok
docker images
刪除鏡像使用以下命令
docker rmi imagename<imageid>
刪除成功
從遠端docker hub拉取鏡像
docker pull imagename<imageid>
查看本地鏡像列表,拉取成功
拉取之前可以查詢docker hub可拉取鏡像列表
docker search imagename
第一個字段爲imagename(鏡像名字),第四個字段爲official,是否爲官方鏡像,個人也可以把自己製作的鏡像放到docker hub上,找到自己想要下載的鏡像名字就可以拉取了。
運行一個新的container
docker run [-i -t -d -p -P -c] [--name]:在容器內運行一個應用程序
-t :在新容器內指定一個僞終端或終端
-i:允許你對容器內的標準輸入進行交互
-d:以進程方式運行容器,讓容器在後臺運行
-p:設置端口
-P:將容器內部使用的網絡端口映射到我們使用的主機,就是讓我們訪問我們使用的主機就等同於訪問到容器內部
-c:command,後面接命令
--name container name:指定容器名字
運行一個新的container並調用打印命令
docker run ubuntu:15.10 /bin/echo "Hello world"
運行一個交互式的container(容器)
docker run -it ubuntu:15.10 /bin/bash
可以發現已經進入到容器當中,退出使用exit或ctl+d
從遠程docker hub拉取一個鏡像
在後臺運行一個新的container
docker run -P --name test1 -d training/webapp python app.py
查看當前運行容器詳情
docker ps
查看容器端口
docker port containername<containerid>
可以看到容器test1的端口映射到了本機的32768,可以訪問本機ip的32768端口來查看
查看容器日誌
docker logs containername<containerid>
停止指定容器
docker stop containername<containerid>
再次運行該容器就可以使用
docker start containername<containerid>
查看指定容器內部運行進程
docker top containername<containerid>
查看歷史啓動的容器
docker ps -a
刪除容器,容器必須處於停止狀態
docker rm containername<containerid>
其它命令
爲鏡像添加新的標籤
docker tag
查詢容器ip
docker inspect containername<containerid>
提交容器副本
docker commit [-m -a] container-id image-name
-m:提交的描述信息
-a:指定鏡像作者
container-id:容器ID
image-name:你要命名的鏡像名
先寫這麼多,後續補充
補充:
前邊有提到可以將自己的本地鏡像上傳到docker hub上,那麼如何生成自己的鏡像呢?docker提供一種docker file的方式來生成本地鏡像,你也可以通過docker file的方式把你的項目打包成鏡像來使用。
四、Dockerfile部分命令
首先,每個指令的前綴必須大寫
FROM 指定基礎鏡像,後可跟鏡像名字或鏡像id
例:FROM centos:6.0
MAINTAINER 作者 指定作者
例:MAINTAINER root
ADD 把文件複製到到容器的指定目錄,如果是tar包會自動解壓,後可跟本地文件或url,如果是url,功能類似於wget
例:ADD nginx-1.9.3.tar.gz /usr/local
RUN 告訴docker要在鏡像內執行的命令,後可跟shell命令或普通命令
例:1.RUN useradd test 2.RUN /bin/echo "hello test"
CMD 容器啓動時要運行的命令
例:1.CMD ["nginx"] 2.CMD ["service mysqld start"]
RUN & CMD 區別:
RUN是構建容器時就運行的命令以及提交運行結果,即執行 docker build時運行,一個dockerfile可以有多個
CMD是容器啓動時執行的命令,即執行 docker run時運行,一個dockerfile只有1個
LABEL爲鏡像指定標籤
例:LABEL version="1.0"
EXPOSE 將容器的監聽端口暴露給外部,這樣才能使主機和container建立映射,即在dokcer run使指定-p端口映射
關係
例:EXPOSE 80
ENV 設置環境變量
例:ENV PATH /usr/local/nginx/sbin:$PATH
VOLUME 可實現掛載功能,可以將內地文件夾或者其他容器中的文件夾掛在到這個容器中,容器使用的是AUFS,
這種文件系統不能持久化數據,當容器關閉後,所有的更改都會丟失。所以當數據需要持久化時用這個命令。
例:VOLUME /usr/local/nginx/conf/nginx.conf /etc/nginx/nginx.conf
將主機上的/usr/local/nginx/conf/nginx.conf文件掛在到容器的/etc/nginx/nginx.conf文件
copy 與add類似,區別爲copy後只能跟本地目錄
workdir 設置工作目錄,類似於linux的cd命令
user 設置啓動容器的用戶 1.USER daemon 2.USER UID
stopsignal 當容器退出時給系統發送什麼樣的指令
dockerfile命令其實有好多和linux系統本身命令的功能相似,還是相對比較好理解,爲方便理解,博主做了一個關於將nginx服務打包成鏡像並使用的一個例子。
首先我們需要把我們的要用到的nginx安裝包和dockerfile放在同一目錄下
創建Dockerfile文件,其實就是把nginx的安裝過程寫成了腳本,只不過要符合dockerfile的規範。
FROM centos:6.7 ---基礎鏡像centos6.7
MAINTAINER test ----dockerfile作者,test
ADD nginx-1.6.2.tar.gz /usr/local/src ----解壓nginx安裝包到container的/usr/local/src中
RUN yum -y install wget gcc gcc-c++ make openssl-devel pcre-devel ---在容器內要執行的命令,安裝包依賴
RUN useradd -s /sbin/nologin nginx --------在容器內要執行的命令,新增nginx用戶
WORKDIR /usr/local/src/nginx-1.6.2 ------------container內跳轉目錄到/usr/local/src/nginx-1.6.2
RUN ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
--with-http_stub_status_module && make && make install ------ 在容器內要執行的命令,源碼安裝nginx
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf ------在容器內要執行的命令,設置nginx前臺運行
ENV PATH /usr/local/nginx/sbin:$PATH ---- ---設置環境變量
EXPOSE 80 --------------------------------------------設置映射端口
CMD ["nginx"] ---------------------------------------容器啓動時要執行的命令
構建鏡像操作
docker build
執行
docker build -t nginx:1.6 .
-t ---------指定鏡像名和標籤
請注意,最後面有一個點 ‘.’,指定dockerfile的路徑,也可以寫爲絕對路徑
執行成功會出現
查看本地鏡像可以看到我們構建的鏡像
運行我們構建的鏡像,映射到本地的80端口
查看本地端口80
訪問本地80端口,成功