最近工作上剛好用到了docker ,所以作為入門學(xué)習(xí),本文就以一個(gè)簡單的例子展開。
推薦一個(gè)不錯(cuò)的入門資料 Docker — 從入門到實(shí)踐 本文也是主要參考了這個(gè)資料
基本概念
- 鏡像
Docker 把應(yīng)用程序及其依賴,打包在 image 文件里面。只有通過這個(gè)文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根據(jù) image 文件生成容器的實(shí)例。同一個(gè) image 文件,可以生成多個(gè)同時(shí)運(yùn)行的容器實(shí)例。
- 容器
image 文件生成的容器實(shí)例,本身也是一個(gè)文件,稱為容器文件
- Dockerfile
docker的配置文件
一個(gè)簡單的例子
下面以一個(gè)hello world頁面為例,介紹docker的基本使用
- 新建一個(gè)docker-test文件夾。
然后在里面創(chuàng)建Dockerfile、index.html、index.css、hello-world.conf四個(gè)文件
# index.html
<!DOCTYPE>
<html>
<head>
<title>docker test</title>
<link rel="stylesheet" href="./index.css" />
</head>
<body>
<p>hello world</p>
</body>
</html>
# index.css
body {
margin: 0;
padding: 0;
background: #f2f2f2;
}
p {
margin-top: 50px;
font-size: 26px;
color: #333;
text-align: center;
}
# hello-world.conf
server {
listen 3000;
location / {
root /usr/local/nginx/html;
index index.html;
}
}
這里采用include的方式加載nginx配置,因?yàn)閚ginx默認(rèn)會(huì)占據(jù)80端口,而include得方式不會(huì)覆蓋原有的配置,所以這里用了3000端口。當(dāng)然,你也可以寫個(gè)完整的nginx.conf直接覆蓋原來的
- 下面就用Dockerfile完成鏡像的配置。
我這里用nginx做web服務(wù),然后暴露出容器的3000端口,在宿主機(jī)上通過5000端口映射到這個(gè)容器中。
FROM nginx:alpine
COPY index.html index.css /usr/local/nginx/html/
COPY hello-world.conf /etc/nginx/conf.d/
CMD ["nginx", "-g", "daemon off;"]
EXPOSE 3000
注意區(qū)分 EXPOSE 和docker run 的 -p,-p 是將容器的對應(yīng)端口服務(wù)公開給外界訪問,而 EXPOSE 僅僅是聲明容器打算使用什么端口而已,并不會(huì)自動(dòng)在宿主進(jìn)行端口映射。
- 文件準(zhǔn)備好,就可以構(gòu)建鏡像了。
docker build -t docker-test:0.0.1 . # 千萬別忘了最后的點(diǎn)
因?yàn)閍lpine基礎(chǔ)鏡像非常小,所以安裝過程應(yīng)該是很快的,看到輸出成功就可以了。
docker image ls # 查看是否有剛剛構(gòu)建好的鏡像
- 生成容器
docker run -d -p 5000:3000 docker-test:0.0.1 # -d 以后臺(tái)方式啟動(dòng)
在瀏覽器中訪問localhost:5000 就能看到我們寫的hello world了。
- 將鏡像推送到倉庫
https://hub.docker.com 這個(gè)是docker官方提供的公共倉庫,我們可以將自己的倉庫放到上面去。
首先我們到上面注冊一個(gè)賬號(hào),才可以繼續(xù)往下走
docker login -u username # 你的用戶名
# 然后輸入密碼,也可以在用戶名后加上 -p password 進(jìn)行登陸
# 會(huì)登陸到默認(rèn)的倉庫地址,也可以在最后面加上加上想要登陸的倉庫地址
# 接著打標(biāo)簽,推送
docker tag docker-test username/docker-test:0.0.1
docker push username/docker-test:0.0.1
# 推送成功就可以在你自己的倉庫下看到docker-test這個(gè)鏡像了
docker pull username/docker-test # 就可以拉下剛推送的鏡像使用了!
到這里一個(gè)簡單的nginx鏡像就制作好,當(dāng)然docker的內(nèi)容遠(yuǎn)遠(yuǎn)不止這些,如多個(gè)容器間的關(guān)聯(lián),容器內(nèi)訪問外部的數(shù)據(jù)等等,當(dāng)然這些我也不懂,一起學(xué)習(xí)吧!
補(bǔ)充
- 一些命令
docker image ls # 列出所有鏡像
docker ps -a # 列出所有容器,包括停止的
docker ps # 列出正在運(yùn)行的容器
docker build -t [image-name][:tag] . # 構(gòu)建鏡像,注意最后有個(gè)點(diǎn)表示Dockerfile所在的路徑, -t 指定名稱和標(biāo)簽
docker run -it -p 5000:5000 [image-name][:tag] bash # 生成容器,-it 進(jìn)入容器內(nèi),bash 表示進(jìn)入后使用的命令 不加則無法使用命令行,-p 將宿主機(jī)的端口映射到容器內(nèi)的端口
docker run -d -p 5000:5000 [image-name] # -d 后臺(tái)方式生成容器
docker exec -it [containerid] bash # 進(jìn)入一個(gè)容器中,這種方式進(jìn)入容器,輸入exit可以安全退出
docker login -u username [registry] #登陸, 在命令行中輸入密碼
docker login -u username -p password [registry] # 登陸
docker tag [image-name] [registry][image-name]:[version] # 打標(biāo)簽
docker push [registry][image-name]:[version] # 推送鏡像的倉庫
- 搭配jenkins
使用Jenkins可以實(shí)現(xiàn)代碼提交后,自動(dòng)測試、自動(dòng)構(gòu)建,并且可以持續(xù)集成到docker倉庫,這樣服務(wù)的更新、回滾都非常方便。
下面就給出一個(gè)簡單的node示例。
docker login -u username -p password [registry]
version=`node -e "console.log(require('./package.json').version)"` # 這里以node為例,設(shè)置版本號(hào)
docker build -t [image-name] . # 別忘了最后的點(diǎn)
docker tag [image-name] [registry][image-name]:$version
docker push [registry][image-name]:$version