docker

⼀、快速⼊⻔
1、基础知识
1.1、Docker简介
docker是什么?
Docker is the company driving(推动) the container movement and the only container platform
provider to address every application across the hybrid cloud(混合云). Today’s businesses are
under pressure to digitally transform(数字化转型) but are constrained(限制) by existing
applications and infrastructure while rationalizing an increasingly diverse portfolio of clouds,
datacenters and application architectures. Docker enables true independence between
applications and infrastructure and developers and IT ops to unlock their potential and creates a
model for better collaboration and innovation.
Docker是⼀个开源的容器引擎,它基于LXC容器技术,使⽤Go语⾔开发。
源代码托管在Github上,并遵从Apache2.0协议。
Docker采⽤C/S架构,其可以轻松的为任何应⽤创建⼀个轻量级的、可移植的、⾃给⾃⾜的容器。
简单来说:Docker就是⼀种快速解决业务稳定环境的⼀种技术⼿段。
使⽤场景
Docker⽣活场景组件
描述
Docker
镜像
它是⼀个只读的⽂件,就类似于我们安装操作系统时候所需要的那个iso光盘镜像,通
过运⾏这个镜像来完成各种应⽤的部署。这⾥的镜像就是⼀个能被docker运⾏起来的
⼀个程序。
Docker
容器
容器就类似于我们运⾏起来的⼀个操作系统,⽽且这个操作系统启动了某些服务。这
⾥的容器指的是运⾏起来的⼀个Docker镜像。
Docker
仓库
仓库就类似于我们在⽹上搜索操作系统光盘的⼀个镜像站。这⾥的仓库指的是Docker
镜像存储的地⽅。
⻆⾊组成
官⽅资料:
Docker 官⽹:http://www.docker.com
Github Docker 源码:https://github.com/docker/docker
1.2、原理解析
Docker Engine是⼀个C/S架构的应⽤程序,主要包含下⾯⼏个组件:
常驻后台进程Dockerd
⼀个⽤来和 Dockerd 交互的 REST API Server
命令⾏CLI接⼝,通过和 REST API 进⾏交互(我们经常使⽤的 docker 命令)流程图
Docker 使⽤ C/S 体系的架构,Docker 客户端与 Docker 守护进程通信,Docker 守护进程负责构建,
运⾏和分发 Docker 容器。Docker 客户端和守护进程可以在同⼀个系统上运⾏,也可以将 Docker 客户
端连接到远程 Docker 守护进程。Docker 客户端和守护进程使⽤ REST API 通过UNIX套接字或⽹络接⼝
进⾏通信。
1.3、Docker安装
安装docker
检查服务
注意:
安装前:只有eth0和lo⽹卡
apt install docker-ce -y
systemctl [start|stop|restart|status|...] docker
docker version|info安装后:docker启动后,多出来了docker0⽹卡,⽹卡地址172.17.0.1
加速配置
2、基础管理
2.1、镜像管理
基本实践
搜索
获取
查看
历史
进阶实践
标签
删除
导出
# 定制加速仓库
echo '{"registry-mirrors": ["https://kcmn5udq.mirror.aliyuncs.com"]}' >
/etc/docker/daemon.json
# 重启服务
systemctl restart docker
docker search [image_name]
docker pull [image_name]
docker images <image_name>
docker history [image_name]
docker tag [old_image]:[old_version] [new_image]:[new_version]
docker rmi [image_id/image_name:image_version]
docker save -o [包⽂件] [镜像]导⼊
2.2、容器管理
基本实践
查看
启动
启动
关闭
删除
进阶实践
进⼊
属性解析
-i:则让容器的标准输⼊保持打开。
-t:让docker分配⼀个伪终端,并绑定到容器的标准输⼊上
/bin/bash:执⾏⼀个命令
提交
⽇志
docker load < [image.tar_name]
docker ps -a
docker run -itd <image_name>
docker start [container_id]
docker stop [container_id]
docker rm [-f] [container_id]
docker exec -it [container_id] /bin/bash
docker commit -m '改动信息' -a "作者信息" [container_id] [new_image:tag]属性
2.3、数据管理
数据卷
数据卷就是将宿主机的某个⽬录,映射到容器中,作为数据存储的⽬录,我们就可以在宿主机对数据进
⾏存储
命令详解
注意:
-v 宿主机⽂件:容器⽂件 可以存在多个,表示同时挂载多个
宿主机问⽂件尽量⽤绝对路径,容器⽂件即使不存在,Docker⾃动创建
简单示例
创建测试⽂件
启动⼀个容器,挂载数据卷
测试效果
2.4、⽹络管理
端⼝映射
功能定位
Docker ⽹络实现⽅式有两种:
端⼝映射 - 将容器内服务端⼝与宿主机端⼝关联在⼀起,通过"宿主机ip:宿主机port"达到访问容器服务
效果
docker logs [container_id]
docker inspect [container_id]
docker run -itd --name [容器名字] -v [宿主机⽂件]:[容器⽂件] [镜像名称]
echo "file1" > /tmp/file1.txt
docker run -itd --name test1 -v /tmp:/test1 nginx
~# docker exec -it a53c61c77 /bin/bash
root@a53c61c77bde:/# cat /test1/file1.txt
file1⽹络模式 - 借助于独⽴的docker⽹卡功能实现访问容器服务的效果
命令格式:
docker -P|p [镜像名称]
注意:
-P(⼤写) 指的是容器应⽤PORT随机映射到宿主机上的PORT
⽣产场景⼀般不使⽤随机映射,好处是由docker分配,宿主机端⼝不会冲突,
-p(⼩写) 宿主机IP:宿主机PORT:容器PORT
指定端⼝映射,在标准化场景下使⽤频率⾼,
宿主机IP不写表示"0.0.0.0",宿主机PORT不写表示随机端⼝,容器PORT必须指定
简单实践
默认随机映射
docker run -d -P nginx
指定端⼝映射
docker run -d -p 192.168.8.13:777:80 --name nginx-2 nginx
⽹络模型
命令格式
docker network help|ls|create|...
模式解析
bridge模式:Docker的默认模式,它会在docker容器启动时候,⾃动配置好⾃⼰的⽹络信息,同⼀宿
主机的所有容器都在⼀个⽹络下,彼此间可以通信。类似于我们vmware虚拟机的nat模式。
利⽤宿主机的⽹卡进⾏通信,因为涉及到⽹络转换,所以会造成资源消耗,⽹络效率会低。
host模式:鸠占鹊巢,⽤着宿主机的东⻄,⼲⾃⼰的事情。容器使⽤宿主机的ip地址进⾏通信。特点:容器和宿主机共享⽹络
none模式:这种模式最纯粹,不会帮你做任何⽹络的配置,可以最⼤限度的定制化。
简单实践
容器使⽤宿主机的ip地址和端⼝进⾏通信,容器和宿主机共享⽹络。
使⽤⽹络
断开⽹络
连接⽹络
⼆、Dockerfile
1、基础知识
1.1、功能简介
docker run --network=host -itd --name <容器名称> <镜像名称>
docker run --network=host -itd --name nginx-host nginx
docker network disconnect bridge-test nginx-new-bri
docker network connect bridge-test nginx-new-bri1、选⼀个基础镜像
2、启动成⼀个容器
3、进⼊容器
4、在容器内容进⾏配置(例如安装nginx等)
5、基于修改配置的容器构造成新的镜像
什么是Dockerfile
Dockerfile类似于我们学习过的脚本,将我们在上⾯学到的docker镜像,使⽤⾃动化的⽅式实现出来。
镜像构建流程
1、找⼀个镜像: centos
2、创建⼀个容器: docker run centos
3、进⼊容器: docker exec -it 容器 命令
4、操作: 各种应⽤配置
..........
5、构造新镜像: docker commit
Dockerfile就是把上述的镜像构建流程实现脚本⾃动化!
使⽤准则
1、⼤: ⾸字⺟必须⼤写D
2、空: 尽量将Dockerfile放在空⽬录中。
3、单: 每个容器尽量只有⼀个功能。
4、少: 执⾏的命令越少越好。
基础四指令
FROM : 基础镜像信息 从哪来?
MAINTAINER : 维护者信息 我是谁?
RUN : 镜像操作指令 怎么⼲?
ENTRYPOINT : 容器启动时执⾏指令 嗨!
使⽤Dockerfile脚本构建镜像的命令
构建镜像命令格式:
构建样例:
参数详解:
-t 指定构建后的镜像信息,默认是以构建后的docker image的id号为镜像名称
/opt/dockerfile/nginx/ 代表Dockerfile存放位置,如果是当前⽬录,则⽤ .(点)表示
1.2、快速⼊⻔
1.2.1、简单实践
docker build -t [镜像名]:[版本号] [Dockerfile所在⽬录]
docker build -t nginx:v0.2 /opt/dockerfile/nginx/以下案例,我们准备编写⼀个Dockerfile脚本,构造⼀个具备python3环境的镜像。
1、创建Dockerfile专⽤⽬录
mkdir /data/docker/base/
cd /data/docker/base/
2、准备⽂件
在 /data/docker/base ⽬录下新建 Dockerfile ⽂件
3、编写 Dockerfile 脚本⽂件
# 构建⼀个基于python3.7的定制镜像
# 基础镜像
FROM ubuntu:18.04
# 镜像维护者信息
MAINTAINER weiwei
# 安装python3
RUN apt-get install python3-pip -y
# 暴露端⼝
EXPOSE 80
# 执⾏命令
ENTRYPOINT ["nginx", "-g daemon off;"]
4、构建镜像
docker build -t newubuntu:1.0
5、使⽤新镜像启动⼀个容器,查看效果
docker container run -d --name python newubuntu:1.0
6、容器检查
docker container ls -a
docker container exec -it pyhton /bin/bash
构建过程
从基础镜像1运⾏⼀个容器A
遇到⼀条Dockerfile指令,都对容器A做⼀次修改操作
执⾏完毕⼀条命令,提交⽣成⼀个新镜像2模式
格式
示例
shell模式
类似于 /bin/bash -c command
RUN echo hello
exec 模式
类似于 RUN ["/bin/bash", "-c", "command"]
RUN ["echo", "hello"]
再基于新的镜像2运⾏⼀个容器B
遇到⼀条Dockerfile指令,都对容器B做⼀次修改操作
执⾏完毕⼀条命令,提交⽣成⼀个新镜像3
...
注意: 镜像是分层的保存的
1.2.2、基础指令
FROM
格式:
解释:
FROM 是 Dockerfile ⾥的第⼀条⽽且只能是除了⾸⾏注释之外的第⼀条指令
MAINTAINER
格式:
解释:
指定该dockerfile⽂件的维护者信息。类似我们在docker commit 时候使⽤-a参数指定的信息
RUN
格式:
解释:
表示当前镜像构建时候运⾏的命令
注释:
FROM <image>
FROM <image>:<tag>。
MAINTAINER <name>
RUN <command> (shell模式)
RUN ["executable", "param1", "param2"]。 (exec 模式)ADD
格式:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
解释:
将指定的 ⽂件复制到容器⽂件系统中的
src 指的是宿主机,dest 指的是容器
如果源⽂件是个压缩⽂件,则docker会⾃动帮解压到指定的容器中(⽆论⽬标是⽂件还是⽬录,都
会当成⽬录处理)。
COPY
格式:
COPY <src>... <dest>
COPY ["<src>",... "<dest>"]
解释:
单纯复制⽂件场景,Docker推荐使⽤COPY
WORKDIR
格式:
WORKDIR /path/to/workdir (shell 模式)
解释:
切换⽬录,为后续的RUN、CMD、ENTRYPOINT 指令配置⼯作⽬录。 相当于cd
可以多次切换(相当于cd命令),
也可以使⽤多个WORKDIR 指令,后续命令如果参数是相对路径,则会基于之前命令指定的路径。
举例:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
则最终路径为 /a/b/c。
EXPOSE
格式:解释:
设置Docker容器对外暴露的端⼝号,Docker为了安全,不会⾃动对外打开端⼝,如果需要外部提
供访问,还需要启动容器时增加-p或者-P参数对容器的端⼝进⾏分配。
ENTRYPOINT
格式:
解释:
每个 Dockerfile 中只能有⼀个 ENTRYPOINT,当指定多个时,只有最后⼀个起效。
2、项⽬实践
2.1、项⽬分析
改造⽬标
基于docker镜像,⼿⼯部署美多商城项⽬环境
流程分析:
1、docker环境部署
2、项⽬环境部署
3、项⽬部署
4、测试
关键点分析
1、docker环境部署
使⽤docker镜像启动⼀个容器即可
由于我们需要在外部看到容器内效果,所以需要暴露端⼝信息
2、项⽬环境部署
项⽬依赖模块环境
包括nginx+uwsgi+django等模块
3、项⽬部署
nginx配置 - 主要是 nginx.conf 和 meiduo.conf
EXPOSE <port> [<port>...]
ENTRYPOINT ["executable", "param1","param2"] (exec 模式)
ENTRYPOINT command param1 param2 (shell模式)uwsgi配置 - 主要是 uwsgi.ini
4、测试
宿主机测试
2.2、项⽬部署(⼿动构建镜像)
0、准备⼯作(宿主机)
准备⽂件夹 /data/docker/base
将nginx配置⽂件拷⻉到 /data/docker/base ⽬录下
cp /etc/nginx/conf.d/8080.conf /data/docker/base
cp /etc/nginx/conf.d/8081.conf /data/docker/base
cp /etc/nginx/conf.d/8000.conf /data/docker/base
将⼯程⽂件打包到 /data/docker/base ⽬录下
cd /data/docker/base
tar -zcvf front_end_pc.tar.gz /data/front_end_pc
tar -zcvf meiduo_mall_admin.tar.gz /data/meiduo_mall_admin
tar -zcvf meiduo_mall.tar.gz /data/meiduo_mall
1、选择 ubuntu:18.04 镜像并运⾏成容器(别名为 meiduo )
docker container run -d --name meiduo ubuntu:18.04
2、进⼊ meiduo 容器
docker container exec -it meiduo /bin/bash
3、更新下载源(从第3步开始后续全部都是在容器中操作)
apt-get update
4、安装依赖
4.1、Nginx安装(⻙伟⽼师给的镜像已经安装好啦)
apt-get install nginx -y --allow-unauthenticated
4.2、安装python3环境(⻙伟⽼师给的镜像已经安装好啦)
apt-get install python3-pip -y
5、上传⼯程⽂件 front_end_pc.tar.gz 、 meiduo_mall_admin.tar.gz 和 meiduo_mall.tar.gz 到容器
中;
scp root@192.168.203.151:/data/docker/base/front_end_pc.tar.gz /data/
scp root@192.168.203.151:/data/docker/base/meiduo_mall_admin.tar.gz /data/
scp root@192.168.203.151:/data/docker/base/meiduo_mall.tar.gz /data/安装美多⼯程依赖环境(⻙伟⽼师给的镜像已经安装好啦)
cd /data/meiduo_mall
pip3 install -r requirements.txt
6、上传部署⽤nginx配置⽂件
scp root@192.168.203.151:/data/docker/base/8080.conf /etc/nginx/conf.d
scp root@192.168.203.151:/data/docker/base/8081.conf /etc/nginx/conf.d
scp root@192.168.203.151:/data/docker/base/8000.conf /etc/nginx/conf.d
7、退出并重启容器(⽬的是重启nginx服务)
8、进⼊容器并启动美多⼯程
docker container exec -it meiduo /bin/bash
cd /data/meiduo_mall
uwsgi --ini uwsgi.ini
2.3、项⽬Dockerfile部署(脚本构建镜像)
1、编写 /data/docker/base/Dockerfile 脚本,内容如下:
# 选择基础镜像
FROM ubuntu:18.04
# 作者
MAINTAINER weiwei
# 更新源(⻙伟⽼师给的镜像已经安装好故不⽤执⾏)
# RUN apt-get update -y
# 安装nginx(⻙伟⽼师给的镜像已经安装好故不⽤执⾏)
# RUN apt-get install nginx -y --allow-unauthenticated
# 安装python3(⻙伟⽼师给的镜像已经安装好故不⽤执⾏)
# RUN apt-get install python3-pip -y
# 把⼯程⽂件上传容器
ADD front_end_pc.tar.gz /data/
ADD meiduo_mall_admin.tar.gz /data/
ADD meiduo_mall.tar.gz /data/
# 切换到美多⼯程⽬录,并且安装依赖(⻙伟⽼师给的镜像已经安装好故不⽤执⾏)
# WORKDIR /data/meiduo_mall/
# RUN pip3 install -r requirements.txt
COPY 8080.conf /etc/nginx/conf.d/
COPY 8081.conf /etc/nginx/conf.d/
COPY 8000.conf /etc/nginx/conf.d/# 设置环境变量;作⽤:指定系统语⾔为UTF-8;如果不设置,uwsgi运⾏⽆法处理中⽂语⾔
ENV LC_ALL="zh_CN.utf8"
# 容器开放端⼝为8080和8081
EXPOSE 8080 8081
# 发送容器启动脚本
COPY command.sh /data
# 切换容器⽬录
WORKDIR /data
# 指定容器运⾏的启动指令
ENTRYPOINT ["/bin/bash", "command.sh"]
启动脚本 command.sh 内容如下:
cd /data/meiduo_mall/
uwsgi --ini uwsgi.ini
nginx -g "daemon off;"
2、使⽤ Dockerfile 脚本⽣成镜像
docker image build -t meiduo ./
 
原文地址:https://www.cnblogs.com/zhangwei112/p/13588385.html