概念
Docker 使用 Google 公司推出的 Go 語言進(jìn)行開發(fā)實(shí)現(xiàn)(k8s也是Go語言)力喷,基于 Linux 內(nèi)核的cgroup恩急,namespace企孩,以及 AUFS 類的 Union FS 等技術(shù)绘面,對(duì)進(jìn)程進(jìn)行封裝隔離腻惠,屬于操作系統(tǒng)層面的虛擬化技術(shù)环肘。由于隔離的進(jìn)程獨(dú)立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器集灌。最初實(shí)現(xiàn)是基于 LXC悔雹,從 0.7 版本以后開始去除 LXC,轉(zhuǎn)而使用自行開發(fā)的 libcontainer欣喧,從 1.11 開始腌零,則進(jìn)一步演進(jìn)為使用 runC 和 containerd
docker應(yīng)該是目前最流行的容器解決方案,它的思想來源于集裝箱唆阿,集裝箱的作用是什么益涧?封存、隔離貨物驯鳖。我們把海鮮和水果分別裝在不同的集裝箱里饰躲,由同一艘大船去運(yùn)輸。這是不是要比分兩艘船來的方便臼隔、快捷、高效呢妄壶。舉例:公司的開發(fā)環(huán)境和生產(chǎn)環(huán)境不一致摔握,開發(fā)出來的程序在開發(fā)人員本地能運(yùn)行,上了生產(chǎn)卻運(yùn)行不了丁寄。你懂得氨淌,這個(gè)時(shí)候就要開始甩鍋了泊愧。這中情況如果用docker就不一樣了,我們直接把開發(fā)環(huán)境build成一個(gè)鏡像盛正,然后由運(yùn)維去把這個(gè)docker鏡像部署上就OK了删咱。環(huán)境一毛一樣
如下圖所示,運(yùn)行一個(gè)容器的過程:
- 去registry中拉取鏡像豪筝,如果本地已經(jīng)存在痰滋,則直接使用本地鏡像
- 根據(jù)鏡像創(chuàng)建容器
- 給容器分配文件系統(tǒng),并在最上層掛載一個(gè)可讀寫層续崖。
- 分配網(wǎng)絡(luò)接口敲街,創(chuàng)建一個(gè)允許容器和宿主機(jī)訪問得網(wǎng)絡(luò)接口
- 運(yùn)行指定的程序
- 收集容器的運(yùn)行狀態(tài)
docker,最核心的是理解三個(gè)概念严望,分別是:倉庫(Registry)多艇、鏡像(image)和容器(Container)
<p id="div-border-left-blue">docker-io, docker-engin</p>
是以前早期的版本,版本號(hào)是 1.x像吻,默認(rèn)centos7 安裝的是docker-io峻黍,最新版是 1.13
<p id="div-border-left-blue">docker-ce</p>
是社區(qū)版本,適用于剛剛開始docker 和開發(fā)基于docker研發(fā)的應(yīng)用開發(fā)者或者小型團(tuán)隊(duì)拨匆。Ubuntu默認(rèn)安裝的是docker-ce
<p id="div-border-left-blue">docker-ee</p>
是docker的企業(yè)版姆涩,適用于企業(yè)級(jí)開發(fā),同樣也適用于開發(fā)涮雷、分發(fā)和運(yùn)行商務(wù)級(jí)別的應(yīng)用的IT 團(tuán)隊(duì)
安裝
Docker 要求 CentOS 系統(tǒng)的內(nèi)核版本高于 3.10 阵面,驗(yàn)證你的CentOS 版本是否支持 Docker
uname -a
[root@VM_0_14_centos ~]# uname -a
Linux VM_0_14_centos 3.10.0-1062.9.1.el7.x86_64 #1 SMP Fri Dec 6 15:49:49 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
CentOS 7,正好可以支持
安裝命令
yum install docker-ce -y
[root@VM_0_14_centos ~]# yum install docker-ce -y
Loaded plugins: fastestmirror, langpacks
Loading mirror speeds from cached hostfile
...
No package docker-ce available.
Error: Nothing to do
需要先安裝yum源
# 安裝需要的軟件包洪鸭, yum-util 提供yum-config-manager功能样刷,另外兩個(gè)是devicemapper驅(qū)動(dòng)依賴的
yum install -y yum-utils device-mapper-persistent-data lvm2
# 配置Docker的yum源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@VM_0_14_centos ~]# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
Loaded plugins: fastestmirror, langpacks
adding repo from: https://download.docker.com/linux/centos/docker-ce.repo
grabbing file https://download.docker.com/linux/centos/docker-ce.repo to /etc/yum.repos.d/docker-ce.repo
repo saved to /etc/yum.repos.d/docker-ce.repo
可以查看所有倉庫中所有docker版本,并選擇特定版本安裝
yum list docker-ce --showduplicates | sort -r
選擇下載最新版本
yum install docker-ce-19.03.5 -y
安裝成功
常用命令
啟動(dòng)Docker
systemctl start docker
加入開機(jī)啟動(dòng)
systemctl enable docker
查看版本览爵,驗(yàn)證是否安裝成功(有client和service兩部分表示docker安裝啟動(dòng)都成功了)
docker version
[root@VM_0_14_centos ~]# docker version
Client: Docker Engine - Community
Version: 19.03.5
API version: 1.40
Go version: go1.12.12
...
Server: Docker Engine - Community
Engine:
Version: 19.03.5
API version: 1.40 (minimum version 1.12)
Go version: go1.12.12
...
查看Docker的使用信息
docker info
搜索鏡像
docker search images_name
# NAME列:沒有斜線分隔的名字稱為頂級(jí)倉庫置鼻,一般屬于docker hub官方所有;有斜線分隔符的稱為用戶倉庫或者是項(xiàng)目倉庫蜓竹,docker hub官方允許用戶個(gè)人注冊(cè)賬戶建立自己的倉庫箕母。
# DESCRIPTION列:倉庫描述
# STARS列:用戶表示“贊”的個(gè)數(shù)
下載鏡像
docker pull images_name
查看當(dāng)前鏡像列表
docker images
更多命令,參考:這里
docker ps : 查看當(dāng)前正在運(yùn)行的容器
docker ps -a : 查看所有容器的狀態(tài)
docker start/stop id/name : 啟動(dòng)/停止某個(gè)容器
docker attach id : 進(jìn)入某個(gè)容器(使用exit退出后容器也跟著停止運(yùn)行)
docker exec -ti id : 啟動(dòng)一個(gè)偽終端以交互式的方式進(jìn)入某個(gè)容器(使用exit退出后容器不停止運(yùn)行)
docker rm id/name : 刪除某個(gè)容器
docker rmi id/name : 刪除某個(gè)鏡像
# 復(fù)制ubuntu容器并且重命名為test且運(yùn)行俱济,然后以偽終端交互式方式進(jìn)入容器嘶是,運(yùn)行bash
docker run --name test -ti ubuntu /bin/bash
# 通過當(dāng)前目錄下的Dockerfile創(chuàng)建一個(gè)名為soar/centos:7.1的鏡像
docker build -t soar/centos:7.1 .
# 以鏡像soar/centos:7.1創(chuàng)建名為test的容器
# 并以后臺(tái)模式運(yùn)行,并做端口映射到宿主機(jī)2222端口蛛碌,P參數(shù)重啟容器宿主機(jī)端口會(huì)發(fā)生改變
docker run -d -p 2222:22 --name test soar/centos:7.1
容器管理
命令幫助
docker run --help
-d # 后臺(tái)運(yùn)行容器.
-i # 使用交互式訪問容器.
-t # 分配一個(gè)終端聂喇,需要與-i結(jié)合使用.
--name # 給容器分配個(gè)名字.
--network string # 使容器加入到一個(gè)網(wǎng)絡(luò),如不指定,默認(rèn)就是加到bridge網(wǎng)絡(luò)(可以使用docker network ls查看)希太,使用docker0的虛擬網(wǎng)卡.
--rm # 容器一停克饶,就自動(dòng)刪除.
直接創(chuàng)建、啟動(dòng)并登入容器(啟動(dòng)容器的鏡像可以不用提前下載誊辉,執(zhí)行run命令的時(shí)候會(huì)自動(dòng)下載)
docker run --name bbox -it busybox:latest
啟動(dòng)一個(gè)容器:
# 如果容器是一個(gè)后臺(tái)守護(hù)進(jìn)程矾湃,那直接start就可以了,如果需要直接進(jìn)入交互式接口堕澄,需要加-ai的參數(shù)
docker start -ai bbox
停止一個(gè)容器:
# stop和kill區(qū)別就是:stop是發(fā)送15的信號(hào)邀跃,kill是發(fā)送9的信號(hào)。kill是強(qiáng)制殺死奈偏,有丟失數(shù)據(jù)的可能坞嘀,所以一般不建議使用。
docker stop bbox
刪除一個(gè)容器:
docker rm bbox
啟動(dòng)一個(gè)后臺(tái)運(yùn)行的容器:
docker run --name web01 -d nginx:1.14-alpine
docker ps -a
docker inspect web01 | grep IPAddress
登入后臺(tái)運(yùn)行的容器:
docker exec -it web01 /bin/bash
查看容器訪問日志:
# 一般情況下容器只會(huì)運(yùn)行程序這一個(gè)進(jìn)程惊来,日志都是保存在于宿主機(jī)上的丽涩,可以用下面命令查看。
docker logs web01
Django鏡像
所謂倉庫裁蚁,其實(shí)是個(gè)鏡像倉庫矢渊,里面有很多別人已經(jīng)打包好的鏡像,可以直接使用docker枉证,pull命令將倉庫中的鏡像拉到本地矮男,默認(rèn)的倉庫Docker的官方倉庫Docker Hub Registry
因?yàn)閴Φ木壒剩俜絺}庫的速度會(huì)比較慢室谚,可以配一個(gè)官方的中國加速鏡像毡鉴,方法是:修改/etc/docker/daemon.json
,加上如下的鍵值:
{
"registry-mirrors": ["https://registry.docker-cn.com"]
}
之后重啟docker服務(wù)即可生效
基于Python3容器制作新的Django鏡像
在這里找到想要下載的鏡像
# 下載
docker pull python:3.6.10-alpine
# 后臺(tái)運(yùn)行
docker run --name django_v1 -itd python:3.6.10-alpine
# 登錄容器
docker exec -it django_v1 sh
# 退出
exit
這里如果用/bin/bash
會(huì)報(bào)錯(cuò):
[root@VM_0_14_centos ~]# docker exec -it django_v1 /bin/bash
OCI runtime exec failed: exec failed: container_linux.go:346: starting container process caused "exec: \"/bin/bash\": stat /bin/bash: no such file or directory": unknown
因?yàn)椋?/p>
我們一般可能會(huì)在容器啟動(dòng)后進(jìn)入容器秒赤,常用的是docker attach 鏡像id
猪瞬,但是啟動(dòng)鏡像的時(shí)候如果沒有帶 參數(shù) -it的話,attach進(jìn)去后可能是日志界面入篮,并不能執(zhí)行命令陈瘦。所以我們會(huì)用docker exec -it 鏡像id /bin/bash/
平常的容器一般都可以執(zhí)行/bin/bash,但是alpine沒有潮售,改成docker exec -it 鏡像id sh
就好了
進(jìn)入容器后安裝其他依賴
cd ~
mkdir .pip
vi .pip/pip.conf
# 添加
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
# 添加為信任的host
[install]
trusted-host = mirrors.aliyun.com
# 保存
# 安裝yum
wget http://yum.baseurl.org/download/3.2/yum-3.2.28.tar.gz
tar xvf yum-3.2.28.tar.gz
...
pip3 install django==2.2.7
pip3 install uwsgi
# 通過yum安裝nginx
yum install nginx -y
# 創(chuàng)建軟連接
ln -s /usr/local/python3/bin/uwsgi /usr/bin/uwsgi
ln -s /usr/local/python3/bin/django-admin.py /usr/bin/django-admin
這就有點(diǎn)麻煩痊项,這個(gè)容器中很多Linux命令都沒有,需要你自己手動(dòng)安裝很多東西酥诽,所以暫時(shí)不考慮這種方式
基于Dockerfile制作Django鏡像
在需要部署的Django項(xiàng)目的根目錄下鞍泉,添加三個(gè)文件Dockerfile
,requirements.txt
肮帐,pip conf
FROM python:3.6 這里指定 Python 版本為目前穩(wěn)定的 python3.6
FROM python:3.6
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY pip.conf /root/.pip/pip.conf
COPY requirements.txt /usr/src/app/
RUN pip install -r /usr/src/app/requirements.txt
RUN rm -rf /usr/src/app
COPY . /usr/src/app
CMD [ "python3", "./manage.py", "runserver", "0.0.0.0:8089"]
使用鏡像 pip install 相關(guān)依賴
[global]
index-url = http://mirrors.aliyun.com/pypi/simple/
extra-index-url= https://pypi.tuna.tsinghua.edu.cn/simple
[install]
trusted-host=
mirrors.aliyun.com
pypi.tuna.tsinghua.edu.cn
通過這個(gè)命令即可生成requirements.txt
pip3 freeze > requirements.txt
...
同樣在Django根目錄下咖驮,也就是Dockerfile文件所在的目錄
docker build -t my_django:v1.0 .
其中-t my_django:v1.0
表示打包的鏡像名為my_django
,tag為v1.0
,前面說過游沿,tag是可以任意命名的,不一定要是這種格式肮砾,注意命令的最后有一個(gè).
诀黍,這個(gè)表示打包的上下文(其實(shí)就是Dockerfile所在目錄)是在當(dāng)前目錄,然后目錄下的Dockerfile就會(huì)被編譯執(zhí)行
執(zhí)行完畢后運(yùn)行docker images
就會(huì)發(fā)現(xiàn)多了一個(gè)my_django
鏡像
若build過慢仗处,我的是騰訊云下使用的centos7
服務(wù)器眯勾,可以
# 使用騰訊云dockerhub加速器
# 創(chuàng)建或修改 /etc/docker/daemon.json 文件,并添加如下:
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
依次執(zhí)行以下命令婆誓,重新啟動(dòng) Docker 服務(wù)
systemctl daemon-reload
systemctl restart docker
執(zhí)行docker info
命令囤官,返回結(jié)果中包含以下內(nèi)容呻纹,則說明配置加速成功
Registry Mirrors:
https://mirror.ccs.tencentyun.com
生成鏡像成功
...
---> ec6c706a5f6e
Step 7/9 : RUN rm -rf /usr/src/app
---> Running in 318cc576230f
Removing intermediate container 318cc576230f
---> 21b97e82ebf7
Step 8/9 : COPY . /usr/src/app
---> 793452ffa1d7
Step 9/9 : CMD [ "python3", "./manage.py", "runserver", "0.0.0.0:8089"]
---> Running in a3448d5b9541
Removing intermediate container a3448d5b9541
---> f5bb78cebbc8
Successfully built f5bb78cebbc8
Successfully tagged my_django:v1.0
開啟容器
這里的8089
由上面的Dockerfile
決定
這里的 xxx.xxx.xxx.xxx 為自己服務(wù)器公網(wǎng)IP地址
# http://xxx.xxx.xxx.xxx:8089
docker run -it --rm -p 8089:8089 --name django_v1 my_django:v1.0
# 或者 http://xxx.xxx.xxx.xxx:8000(端口號(hào)隨意映射,但要注意開啟對(duì)應(yīng)安全組)
docker run -it --rm -p 8000:8089 --name django_v1 my_django:v1.0
結(jié)果報(bào)mysqlclient的錯(cuò):
...mysqlclient 1.3.13 or newer is required; you have 0.7.11.None
因?yàn)槭侨萜髦械奈募栴},所以只好到容器中修改
# 后臺(tái)運(yùn)行
docker run --name django_v1 -d my_django:v1.0
# 登錄容器
docker exec -it django_v1 sh
find / -name base.py
# 因?yàn)闆]有vim以及vi狼讨,所以得安裝,時(shí)間有點(diǎn)久
apt-get update
apt-get install vim
vim /usr/local/lib/python3.6/site-packages/django/db/backends/mysql/base.py
修改如下题禀,這兩行注釋掉:
# if version < (1, 3, 3):
# raise ImproperlyConfigured("mysqlclient 1.3.3 or newer is required; you have %s" % Database.__version__)
然后exit
為了區(qū)別馍资,并重新運(yùn)行添加端口,commit一個(gè)新的my_django鏡像
# docker commit containerID/name images
docker commit -a 'joel' django_v1 my_django:v2.0
現(xiàn)在又多了一個(gè)鏡像
[root@VM_0_14_centos LVideo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
my_django v2.0 82eb6e8ad0cc 3 minutes ago 1.08GB
my_django v1.0 f5bb78cebbc8 About an hour ago 1.03GB
python 3.6 62f74e9ce5f1 6 days ago 914MB
我們可以將鏡像提交到docker hub
注冊(cè)hub.docker.com的賬號(hào)燥翅,點(diǎn)擊"Repositories"菜單骑篙,然后點(diǎn)擊"Create Repository +"來創(chuàng)建一個(gè)倉庫,創(chuàng)建完成后瀏覽器的窗口不要關(guān)閉
docker login -u joelying
Password:
Login Succeeded
# 驗(yàn)證成功森书,開始進(jìn)行push操作靶端,此處加了tag,如果不加tag凛膏,就是將此鏡像的所有版本都push上去
docker push joelying/my_django:v2.0
若出現(xiàn)
denied: requested access to the resource is denied
實(shí)際上是因?yàn)樵趯㈢R像push到自己新建的賬戶之前杨名,要用docker tag重命名一下,將鏡像命名你的用戶名/鏡像名
這種形式译柏,不然會(huì)push認(rèn)證不通過镣煮,如:
[root@VM_0_14_centos LVideo]# docker tag my_django:v2.0 joelying/my_django:v2.0
[root@VM_0_14_centos LVideo]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
joelying/my_django v2.0 82eb6e8ad0cc 15 minutes ago 1.08GB
my_django v2.0 82eb6e8ad0cc 15 minutes ago 1.08GB
...
# 注意時(shí)間很久
[root@VM_0_14_centos LVideo]# docker push joelying/my_django:v2.0
這下就push成功
參考
* Centos7下安裝Docker(詳細(xì)的新手裝逼教程)
Centos6.5下安裝docker+升級(jí)內(nèi)核+禁用selinux
* Docker與Dockerfile極簡入門文檔(一目了然)
* docker(三):docker鏡像管理
* 編寫Dockerfile與項(xiàng)目實(shí)踐+各類項(xiàng)目dockerfile編寫
* docker版Django
* Python3.6 使用 Docker 快速部署 Django2.0 項(xiàng)目到阿里云服務(wù)器上
包含鏡像分享至docker hub
Docker:發(fā)布自己鏡像問題denied: requested access to the resource is denied解決方法
linux python3換pip 源
linux下yum安裝的最簡方法
linux如何安裝yum