docker容器創(chuàng)建的全流程分享
普通啟動(dòng)的容器
runoob@runoob:~$ docker run ubuntu:15.10 /bin/echo "Hello world" Hello world
各個(gè)參數(shù)解析:
- docker: Docker 的二進(jìn)制執(zhí)行文件。
- run:與前面的 docker 組合來運(yùn)行一個(gè)容器。
- ubuntu:15.10指定要運(yùn)行的鏡像,Docker首先從本地主機(jī)上查找鏡像是否存在,如果不存在,Docker 就會(huì)從鏡像倉(cāng)庫 Docker Hub 下載公共鏡像。
- /bin/echo "Hello world": 在啟動(dòng)的容器里執(zhí)行的命令
運(yùn)行交互式的容器
我們通過docker的兩個(gè)參數(shù) -i -t,讓docker運(yùn)行的容器實(shí)現(xiàn)"對(duì)話"的能力
runoob@runoob:~$ docker run -i -t ubuntu:15.10 /bin/bash root@dc0050c79503:/#
各個(gè)參數(shù)解析:
- -t:在新容器內(nèi)指定一個(gè)偽終端或終端。
- -i:允許你對(duì)容器內(nèi)的標(biāo)準(zhǔn)輸入 (STDIN) 進(jìn)行交互。
啟動(dòng)容器(后臺(tái)模式)
使用以下命令創(chuàng)建一個(gè)以進(jìn)程方式運(yùn)行的容器
runoob@runoob:~$ docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done" 2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63
首先,我們需要確認(rèn)容器有在運(yùn)行,可以通過 docker ps 來查看
runoob@runoob:~$ docker ps
- CONTAINER ID:容器ID
- NAMES:自動(dòng)分配的容器名稱
在容器內(nèi)使用docker logs命令,查看容器內(nèi)的標(biāo)準(zhǔn)輸出
runoob@runoob:~$ docker logs 2b1b7a428627
停止容器
我們使用 docker stop 命令來停止容器:
通過docker ps查看,容器已經(jīng)停止工作:
runoob@runoob:~$ docker ps
運(yùn)行一個(gè)web應(yīng)用
前面我們運(yùn)行的容器并沒有一些什么特別的用處。
接下來讓我們嘗試使用 docker 構(gòu)建一個(gè) web 應(yīng)用程序。
我們將在docker容器中運(yùn)行一個(gè) Python Flask 應(yīng)用來運(yùn)行一個(gè)web應(yīng)用。
runoob@runoob:~# docker pull training/webapp # 載入鏡像 runoob@runoob:~# docker run -d -P training/webapp python app.py
參數(shù)說明:
- -d:讓容器在后臺(tái)運(yùn)行。
- -P:將容器內(nèi)部使用的網(wǎng)絡(luò)端口映射到我們使用的主機(jī)上。
查看 WEB 應(yīng)用容器
使用 docker ps 來查看我們正在運(yùn)行的容器:
Docker 開放了 5000 端口(默認(rèn) Python Flask 端口)映射到主機(jī)端口 32769 上。
這時(shí)我們可以通過瀏覽器訪問WEB應(yīng)用
我們也可以通過 -p 參數(shù)來設(shè)置不一樣的端口:
runoob@runoob:~$ docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在運(yùn)行的容器
runoob@runoob:~# docker ps CONTAINER ID IMAGE PORTS NAMES bf08b7f2cd89 training/webapp ... 0.0.0.0:5000->5000/tcp wizardly_chandrasekhar d3d5e39ed9d3 training/webapp ... 0.0.0.0:32769->5000/tcp xenodochial_hoov
容器內(nèi)部的 5000 端口映射到我們本地主機(jī)的 5000 端口上。
網(wǎng)絡(luò)端口的快捷方式
通過 docker ps 命令可以查看到容器的端口映射,docker 還提供了另一個(gè)快捷方式 docker port,使用 docker port 可以查看指定 (ID 或者名字)容器的某個(gè)確定端口映射到宿主機(jī)的端口號(hào)。
上面我們創(chuàng)建的 web 應(yīng)用容器 ID 為 bf08b7f2cd89 名字為 wizardly_chandrasekhar。
我可以使用 docker port bf08b7f2cd89 或 docker port wizardly_chandrasekhar 來查看容器端口的映射情況。
runoob@runoob:~$ docker port bf08b7f2cd89 5000/tcp -> 0.0.0.0:5000
runoob@runoob:~$ docker port wizardly_chandrasekhar 5000/tcp -> 0.0.0.0:5000
查看 WEB 應(yīng)用程序日志
docker logs [ID或者名字] 可以查看容器內(nèi)部的標(biāo)準(zhǔn)輸出。
runoob@runoob:~$ docker logs -f bf08b7f2cd89 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) 192.168.239.1 - - [09/May/2016 16:30:37] "GET / HTTP/1.1" 200 - 192.168.239.1 - - [09/May/2016 16:30:37] "GET /favicon.ico HTTP/1.1" 404 -
-f: 讓 docker logs 像使用 tail -f 一樣來輸出容器內(nèi)部的標(biāo)準(zhǔn)輸出。
移除WEB應(yīng)用容器
我們可以使用 docker rm 命令來刪除不需要的容器
runoob@runoob:~$ docker rm wizardly_chandrasekhar wizardly_chandrasekhar
刪除容器時(shí),容器必須是停止?fàn)顟B(tài),否則會(huì)報(bào)如下錯(cuò)誤
runoob@runoob:~$ docker rm wizardly_chandrasekhar Error response from daemon: You cannot remove a running container bf08b7f2cd897b5964943134aa6d373e355c286db9b9885b1f60b6e8f82b2b85. Stop the container before attempting removal or force remove
構(gòu)建鏡像
我們使用命令 docker build , 從零開始來創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè) Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構(gòu)建我們的鏡像。
runoob@runoob:~$ cat Dockerfile FROM centos:6.7 MAINTAINER Fisher "fisher@sudops.com" RUN /bin/echo 'root:123456' |chpasswd RUN useradd runoob RUN /bin/echo 'runoob:123456' |chpasswd RUN /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local EXPOSE 22 EXPOSE 80 CMD /usr/sbin/sshd -D
每一個(gè)指令都會(huì)在鏡像上創(chuàng)建一個(gè)新的層,每一個(gè)指令的前綴都必須是大寫的。
第一條FROM,指定使用哪個(gè)鏡像源
RUN 指令告訴docker 在鏡像內(nèi)執(zhí)行命令,安裝了什么。。。
然后,我們使用 Dockerfile 文件,通過 docker build 命令來構(gòu)建一個(gè)鏡像。
runoob@runoob:~$ docker build -t runoob/centos:6.7 . Sending build context to Docker daemon 17.92 kB Step 1 : FROM centos:6.7 ---> d95b5ca17cc3 Step 2 : MAINTAINER Fisher "fisher@sudops.com" ---> Using cache ---> 0c92299c6f03 Step 3 : RUN /bin/echo 'root:123456' |chpasswd ---> Using cache ---> 0397ce2fbd0a Step 4 : RUN useradd runoob ......
參數(shù)說明:
- -t :指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名
- . :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對(duì)路徑
使用docker images 查看創(chuàng)建的鏡像已經(jīng)在列表中存在,鏡像ID為860c279d2fec
runoob@runoob:~$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE runoob/centos 6.7 860c279d2fec About a minute ago 190.6 MB runoob/ubuntu v2 70bf1840fd7c 17 hours ago 158.5 MB ubuntu 14.04 90d5884b1ee0 6 days ago 188 MB php 5.6 f40e9e0f10c8 10 days ago 444.8 MB nginx latest 6f8d099c3adc 12 days ago 182.7 MB mysql 5.6 f2e8d6c772c0 3 weeks ago 324.6 MB httpd latest 02ef73cf1bc0 3 weeks ago 194.4 MB ubuntu 15.10 4e3b13c8a266 5 weeks ago 136.3 MB hello-world latest 690ed74de00f 6 months ago 960 B centos 6.7 d95b5ca17cc3 6 months ago 190.6 MB training/webapp latest 6fae60ef3446 12 months ago 348.8 MB
我們可以使用新的鏡像來創(chuàng)建容器
runoob@runoob:~$ docker run -t -i runoob/centos:6.7 /bin/bash [root@41c28d18b5fb /]# id runoob uid=500(runoob) gid=500(runoob) groups=500(runoob)
從上面看到新鏡像已經(jīng)包含我們創(chuàng)建的用戶runoob
網(wǎng)絡(luò)端口映射
我們創(chuàng)建了一個(gè) python 應(yīng)用的容器。
runoob@runoob:~$ docker run -d -P training/webapp python app.py fce072cc88cee71b1cdceb57c2821d054a4a59f67da6b416fceb5593f059fc6d
另外,我們可以指定容器綁定的網(wǎng)絡(luò)地址,比如綁定 127.0.0.1。
我們使用 -P 參數(shù)創(chuàng)建一個(gè)容器,使用 docker ps 來看到端口5000綁定主機(jī)端口32768。
另外,我們可以指定容器綁定的網(wǎng)絡(luò)地址,比如綁定127.0.0.1。
runoob@runoob:~$ docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py 95c6ceef88ca3e71eaf303c2833fd6701d8d1b2572b5613b5a932dfdfe8a857c
這樣我們就可以通過訪問127.0.0.1:5001來訪問容器的5000端口。
上面的例子中,默認(rèn)都是綁定 tcp 端口,如果要綁定 UDP 端口,可以在端口后面加上 /udp。
runoob@runoob:~$ docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py 6779686f06f6204579c1d655dd8b2b31e8e809b245a97b2d3a8e35abe9dcd22a
docker port 命令可以讓我們快捷地查看端口的綁定情況。
runoob@runoob:~$ docker port adoring_stonebraker 5000 127.0.0.1:5001
Docker容器連接
端口映射并不是唯一把 docker 連接到另一個(gè)容器的方法。
docker有一個(gè)連接系統(tǒng)允許將多個(gè)容器連接在一起,共享連接信息。
docker連接會(huì)創(chuàng)建一個(gè)父子關(guān)系,其中父容器可以看到子容器的信息。
容器命名:
當(dāng)我們創(chuàng)建一個(gè)容器的時(shí)候,docker會(huì)自動(dòng)對(duì)它進(jìn)行命名。另外,我們也可以使用--name標(biāo)識(shí)來命名容器,例如:
runoob@runoob:~$ docker run -d -P --name runoob training/webapp python app.py 43780a6eabaaf14e590b6e849235c75f3012995403f97749775e38436db9a441
我們可以使用 docker ps 命令來查看容器名稱。
runoob@runoob:~$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 43780a6eabaa training/webapp "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:32769->5000/tcp runoob
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
docker overlay實(shí)現(xiàn)跨主機(jī)的容器互通的方法
這篇文章主要介紹了docker overlay實(shí)現(xiàn)跨主機(jī)的容器互通,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-11-11docker-swarm教程之安全保護(hù)加密數(shù)據(jù)的方法詳解
默認(rèn)情況下,集群管理器使用的raft 算法的日志在磁盤上加密,這種靜態(tài)加密可保護(hù)服務(wù)配置和數(shù)據(jù)免受訪問加密Raft日志的攻擊者的攻擊,因此引入了Docker secret功能,來保證加密文件的安全,本文將給大家詳細(xì)的介紹一下如何安全的保護(hù)加密數(shù)據(jù)2023-08-08Docker容器網(wǎng)絡(luò)基礎(chǔ)概述
這篇文章主要介紹了Docker容器網(wǎng)絡(luò)基礎(chǔ)概述,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09docker?Desktop安裝WSL?--update報(bào)錯(cuò)問題成功解決辦法
這篇文章主要介紹了如何在Windows?11上設(shè)置WSL2為默認(rèn)版本,解決WSL2安裝和卸載過程中遇到的問題,包括強(qiáng)制中斷命令、wsl--uninstall命令無效以及手動(dòng)刪除Linux發(fā)行版的方法,需要的朋友可以參考下2025-02-02