前言
读者您好,以下为作者整理编写的文章,
若出现遗漏或书面错误,还请私聊告知一下。
该文章持续更新中, 喜欢的朋友可以收藏★
Docker产生的背景
开发交给运维war包
运维部署环境不兼容
docker的出现,解决了软件的运行环境和配置问题,方便做持续集成,并有助于整体的发布,是容器虚拟化技术。
docker一次编译,到处运行,可以在任何地方构建并运行。
软件可以带环境安装,安装的时候把原环境复制回来
目录
一、docker?
1.1 什么是docker
docker是一个开源
的应用容器引擎,完全沙盒机制,不依赖于任何语言框架或操作系统。是dotCloud公司开源的一个基于LXC的高级容器引擎
,基于go语言
开发的,并遵从Apache2.0协议开源,go语言是谷歌开发的。
容器是完全使用沙盒机制
,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以徆容易地在机器和数据中心中运行。最
重要的是,他们不依赖于任何语言、框架戒包装系统。
*
沙盒就是隔离,英文sandbox,长用于计算机安全技术
扩展:
LXC
为 Linux Container
的简写
Linux Container 容器是一种内核虚拟化技术
,可以提供轻量级的虚拟化,以便隔离进程和资源。通过来自 kernel
的namespace
实现每个用户实例之间的相互隔离
,通过cgroup
实现对资源的配额和度量
。
每个容器互相隔离
,进程不会相互影响。
docker 相对于 VM 虚拟机,少了虚拟机操作系统这一层,所以 docker 效率比虚拟机高。
在 docker 上启动一个实例 1-2 秒。
1.2 docker的图标
logo解析:
一条大鲸鱼上面有很多个集装箱
docker翻译为码头工人,就是搬运工的意思,鲸鱼就是负载很大,集装箱就是海上运货的一个创新,就是隔离独立互不影响的意思。
docker服务相当于鲸鱼
container容器就是集装箱
1.3 docker的特性
文件系统隔离:
每个进程容器运行在一个完全独立的根文件系统里。
资源隔离:
系统资源,像 CPU 和内存等可以分配到不同的容器中,使用 cgroup。
网络隔离:
每个进程容器运行在自己的网络空间,虚拟接口和 IP 地址。
日志记彔:
Docker 将会收集和记彔每个进程容器的标准流(stdout/stderr/stdin),用于实时检索或批量检索。
变更管理:
容器文件系统的变更可以提交到新的镜像中,并可重复使用以创建更多的容器。无需使用模板或手劢配置。
交互式 shell:
Docker 可以分配一个虚拟终端并关联到任何容器的标准输入上,例如运行一个一次性交互 shell。
采用容器化,对进程镜像隔离。可以把软件运行需要的所有资源打包到一个容器中。
官网:
https://www.docker.com
仓库:
https://www.hub.docker.com
源代码下载 :
https://github.com/docker/docker
1.4 docker的镜像
docker镜像为image
image
可以理解为一个系统镜像, Container
是image在运行时的一个状态
。
首先需要先从镜像仓库服务中拉取镜像。常见的镜像仓库服务
是 Docker Hub
,但是也存在其他镜像仓库服务。拉取操作会将镜像下载到本地 Docker 主机,可以使用该镜像启动一个或者多个容器。
镜像由多个层组成,每层叠加之后,从外部看来就如一个独立的对象。镜像内部是一个精简的操作系统(OS),同时还包含应用运行所必须的文件和依赖包。
因为容器
的设计初衷就是快速和小巧
,所以镜像通常都比较小。
1.5 镜像的特点
1、一个分层存储的文件
2、一个软件的环境
3、一个镜像可以创建n个容器
4、一种标准化的交付
5、一个不包含linux内核而又精简的linux操作系统
二、 虚拟化技术
2.1 什么是虚拟化
虚拟化是资源的一种逻辑表示,并不会受限于物理资源。运行的环境不在真实的硬件上,而是硬件之上的虚拟内存中的一段,或者说是虚拟的环境中。虚拟化为数据、计算能力、存储资源等提供了一个逻辑视图,而不是物理视图。
2.2 虚拟化技术
虚拟化分为:
半虚拟化(kvm)、全虚拟化(xen)、硬件辅助虚拟化
例如:
docker容器技术Docker Engine
和虚拟机技术Hypervisor
,都是虚拟化技术。
一个是内核虚拟化
,一个是硬件虚拟化
。
2.3 容器的优点
1.一些优势和 vmware 一样,但不是所有都一样。
比 vmware 小,快,因为简化了实例的大小,一两秒就可以启劢一个实例。
2.对于在硬件上的虚拟机,以及在任何的云上,运行相同的东西,发布速度更快。
3.Docker 是一个开源的平台,可以部署在公司局域网或云或虚拟机上。
4、能够避免开发和生产环境的问题。
5、开发人员不需要考虑底层的系统环境问题,可以根据所需的依赖关系构建相应的开发环境
6.Docker 支持多平台:
Unix/Linux 操作系统,也支持 Windows 或 Mac
7、很多大型企业都支持并使用该技术,例如:Google,微软,亚马逊,IBM 等。
2.4 缺点局限性
Docker 用于应用程序开发时是最有用的,但并不包含数据
。日志,跟踪和数据库等通常都放在 Docker容器外
。一个容器的镜像通常都很小,不适合存大量数据
,存储可以通过外部挂载的方式使用。
比如使用:
NFS,ipsan,MFS 等,
简述:docker 用于计算,存储交给别人。
oracle 不适合使用 docker 来运行,太大,存储的数据多。
三、安装docker
3.1 docker安装条件
1、centos7.x及以上
的版本,64位
操作系统(指64位架构计算机系统)
2、centos仅发行版本中的内核支持docker
3、系统内核版本为3.10或更高版本
查看自己的内核:
以centos为例:
cat /etc/centos-release
或
uname -r
或
dmesg | grep Linux
3.2 部署 docker 环境
首先要搭建yum仓库
安装包
yum install -y docker
服务管理
启动服务
systemctl start docker
停止服务
systemctl stop docker
服务开机自启动
systemctl enable docker
取消自启动
systemctl disable docker
查看docker版本
docker version
docker -v
查看docker的基本信息(系统信息、镜像和容器数等)
docker info
3.3 下载docker镜像
3.3.1 方法一 从dockerhub下载
从DockerHub
下载image(镜像)到本地
步骤一 从Docker Hub中搜索
image
语法:docker search [OPTIONS]
--automated
只列出 automated build类型的镜像;
--no-trunc
显示完整的镜像描述;
-f
<过滤条件> 列出收藏数不小于指定值的镜像。
[root@localhost ~]# docker search centos
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/centos The official build of CentOS. 6936 [OK]
docker.io docker.io/ansible/centos7-ansible Ansible on Centos7 135 [OK]
docker.io docker.io/consol/centos-xfce-vnc Centos container with "headless" VNC sessi... 132 [OK]
参数说明:
Index:分类
NAME:镜像仓库源的名称
DESCRIPTION:镜像的描述
OFFICIAL:是否为docker官方发布
STARS:受欢迎程度
AUTOMATED:自动构建
如果 OFFICIAL 为[ok]
,说明是官方的,可以放心使用
步骤二 从docker hub 拉取
(下载)
语法:docker pull NAME[:TAG]
例如:
docker pull docker.io/centos
3.3.2 TLS handshake timeout的报错
如果出现TLS handshake timeout
的报错,是网络的问题,无法连接到docker hub。
解决方法:
可以使用华为云的镜像加速,提升pull的速度
在浏览器输入https://console.huaweicloud.com/swr/
后,登录华为云账号后,选择下图的镜像加速器,弹出的页面有镜像加速的地址。
也可以使用阿里云的 docker 镜像加速,提升 pull 的速度,在浏览器输入https://cr.console.aliyun.com
后,使用支付宝登录,左侧的加速器会显示为你分配的加速地址。
通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器
vim /etc/docker/daemon.json
修改前:
{}
修改后:
{
"registry-mirrors": ["加速器地址"]
}
刷新一下配置文件
systemctl daemon-reload
重启一下服务
systemctl restart docker
重新下载就可以了
docker pull docker.io/centos
3.3.3 方法二 导入下载的镜像
把之前下载好的 image 镜像
导入到image
docker load -i /root/docker.io-centos.tar
-i
指定载入的镜像位置并归档
3.3.4 方法三 下载其他站点的镜像
下载其他站点
的镜像
docker pull hub.c.163.com/library/tomcat:latest
修改容器的默认下载地址,可以参考以下文档
https://www.cnblogs.com/bigberg/p/8057807.html
3.4 启动网络转发功能
默认是自动开启
的。
如果没启动
会出现以下报错:
WARNING: IPv4 forwarding is disabled. Networking will not work.
手动开启:
在/etcsysctl.conf 文件里插入以下内容
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p #从指定的文件加载系统参数,如不指定即从/etc/sysctl.conf中加载
显示
net.ipv4.ip_forward = 1
查看是否生效
cat /proc/sys/net/ipv4/ip_forward
显示
1 #已开启
四、docker的基本命令
可以通过以下命令来获取帮助
docker --help
4.1 查看images列表和container列表
4.1.1 列出本地image
语法:docker images
查看所有镜像
-a
列出本地所有的镜像(含中间映像层,默认过滤掉中间映像层)
--digests
显示镜像的摘要信息
-f
显示满足条件的镜像
--format
指定返回值的模板文件
--no-trunc
显示完整的镜像信息
-q
只显示镜像ID
docker images #查看所有镜像
[root@localhost ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/mattrayner/lamp latest c15726116aef 3 months ago 1.06 GB
docker.io/centos latest 300e315adb2f 12 months ago 209.3 MB
各个参数的说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
也可以根据镜像仓库名进行关键词查询
语法:dockers images [repository]
[root@localhost ~]# docker images docker.io/centos
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/centos latest 300e315adb2f 12 months ago 209.3 MB
4.1.2 列出本地容器
语法:docker ps
-a
列出所有容器(包含沉睡/退出状态的容器)
-f
根据条件过滤显示的内容。
--format
指定返回值的模板文件。
-l
显示最近创建的容器。
-n
列出最近创建的n个容器。
--no-trunc
不截断输出。
-q
静默模式,只显示容器编号。
-s
显示总的文件大小。
[root@localhost ~]# docker ps #查看运行中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4a2dd203351 300 "/bin/bash" About a minute ago Up 15 seconds elegant_ride
[root@localhost ~]# docker ps -a #列出所有容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b4a2dd203351 300 "/bin/bash" About a minute ago Up 20 seconds elegant_ride
84834e45a958 c1572611 "/run.sh" About an hour ago Exited (137) 7 minutes ago ecstatic_noether
各个参数的说明:
CONTAINER ID: 容器 ID
IMAGE: 使用的镜像
COMMAND: 启动容器时运行的命令
CREATED: 容器的创建时间
STATUS: 容器的状态
NAMES: 自动分配的容器名称
PORTS: 容器的端口信息和使用的连接类型(TCP/UDP)
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
4.1.3 查看镜像中各层内容及大小
语法:docker
history
[repository或image_id]
例如:
[root@localhost ~]# docker history centos
IMAGE CREATED CREATED BY SIZE COMMENT
300e315adb2f 19 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0 B
<missing> 19 months ago /bin/sh -c #(nop) LABEL org.label-schema.sch 0 B
<missing> 19 months ago /bin/sh -c #(nop) ADD file:bd7a2aed6ede423b71 209.3 MB
4.2 选择image运行容器
语法:docker
run
[repository或image_id]
run
运行
-i
以交互模式运行容器,通常与 -t 同时使用;
-t
为容器重新分配一个伪输入终端
-d
后台运行容器,并返回容器 ID;
-c
后面跟待完成的命令
-p
物理机的端口:容器实例的端口
,把容器中的端口映射到物理机的端口上
-P
随机端口映射,容器内部端口随机映射到主机的端口
/bin/bash
放在镜像名后会有个交互式 Shell
-v
--volume 主机目录:容器目录:权限(ro,rw)
, 绑定一个卷,例如 /data:/data,将主机的目录 /data 映射到容器的 /data。
--name
为容器指定一个名称;
-h
指定容器的hostname
例:运行一个 container
并加载镜像 centos
,运行实例后,在实例中执行/bin/bash命令
docker run -it docker.io/centos /bin/bash
docker run -p 80:80 -v /data:/data -d nginx:latest
4.3 退出容器
exit
4.4 从容器中取出日志,查看输出的内容
语法: docker
logs
[Name或container _ID]
(容器的 ID 可以写全,也可以不写全,但要唯一)
docker logs name/id
例:在 container 中启动一个长久运行的进程,不断向 stdin 输出 hello,模拟后台运行的服务。并查看输出的内容。
docker run -d docker.io/centos:latest /bin/sh -c "while true;do echo hello; sleep 1; done"
导出日志
docker logs name/id
4.5 停止容器
语法: docker
stop
[Name或container _ID]
(容器的 ID 可以写全,也可以不写全,但要唯一)
docker stop [Name或container ID]
4.6 重启容器
语法:docker
restart
[Name或container _ID]
docker restart [Name或container ID]
4.7 启动容器
语法:docker
start
[Name或container _ID]
docker start [Name/container ID]
4.8 删除容器和镜像
4.8.1 删除指定的Container
语法:docker
rm
[Name或container _ID]
docker rm [Name或container_ID]
-f
强制删除
如果出现以下报错:
the container before attempting removal or use -f
先把容器关闭
,然后再删除或者加-f 强制删除
4.8.2 删除镜像
语法:docker
rmi
image_Id
docker rmi image_Id
4.9 进入后台的容器
使用 -d 参数时,容器启动后会进入后台。此时要进入容器,可以通过以下指令进入:
4.9.1 使用docker
attach
进入,退出容器终端会停止
容器
语法:docker attach
container_id
docker attach container_id
4.9.2 使用docker
exec
进入,退出容器终端不会停止
容器(建议用这个)
语法:docker exec
container_id
docker exec -it id /bin/bash
4.9.3 小技巧:
忘记或者不懂时,可以加–help查看命令指示
4.10 显示一个正在运行中的容器进程信息
语法:docker top
container_id
4.11 主机和容器之间传输文件
使用docker cp命令
docker cp /path/filename 容器id或名称:/path/filename
docker cp 容器id或名称:/path/filename /path/filename
五、docker 镜像的制作
Docker Image 的两种制作方法
1、docker commit 保存container当前的状态到image后,生成对应的image
2、docker build 需要使用 Dockerfile 文件自动化制作image
5.1 方法 一
docker
commit
先创建一个安装好 apache 工具的容器镜像
进入容器
docker run -it docker.io/centos:latest /bin/bash
在容器里安装 apache 软件包
yum -y install httpd
退出
exit
查看images列表
docker images
查看容器id
docker ps -a
语法:docker commit
<container_ID>或<image_name>
新的镜像名:tag
生成镜像
docker commit container_id new_name:tag
例如:
docker commit b1c docker.io/centos:apache
使用新创建的镜像,生成一台容器实例
docker run -it docker.io/centos:apache /bin/bash
查看是否有httpd包
rpm -qa httpd
如果有,镜像创建成功
5.2 方法二
docker
build
注:Dockerfile 有点像源码编译时./configure 后产生的 Makefile
5.2.1 创建目录和dockerfile文件
创建工作目录
mkdir /docker-build
进入目录
cd docker-build
创建镜像文件
touch dockerfile
5.2.2 编辑dockerfile
vim dockerfile
注: make 自劢化编译时需要 Makefile 文件,自劢化创建 docker 镜像时,需要 Dockerfil
文件内容:
FROM docker.io/centos:latest # FROM 基于哪个镜像
MAINTAINER <wayne> # MAINTAINER 镜像创建者
RUN yum install -y httpd #RUN安装软件用的命令
ADD start.sh /usr/local/bin/start.sh #ADD将文件<src>拷贝到新产生的镜像的文件系统对应的路径<dest>。所有拷贝到新镜像中的文件和文件夹权限为0755,uid和gid为0
ADD index.html /var/www/html/index.html
CMD echo hello world #container启劢时执行的命令戒启劢服务,但是一个 Dockerfile中只能有一条 CMD 命令,多条则只执行最后一条 CMD.
如:dockefile1 中的内容如下:
# vim dockefile1
FROM ubuntu
MAINTAINER xxx
RUN echo hello1 > test1.txt
RUN echo hello2 > /test2.txt
EXPOSE 80
EXPOSE 81
CMD ["/bin/bash"]
5.2.3 创建start.sh
脚本启动httpd服务,默认首页index.html文件
在当前目录配置创建脚本
echo "/usr/sbin/httpd -DFOREGROUND" > start.sh
注:/usr/sbin/httpd -DFOREGROUND 相当于执行了 systemctl start httpd
配置文件的权限
chmod a+x start.sh
在当前目录创建index.html
echo "docker image build test" > index.html
5.2.4 使用命令 build 来创建新的 image
语法:docker
build
-t
父镜像名:镜像的tag
Dockerfile所在的目录
-t
表示 tage,镜像名
例:使用命令 docker build 来创建新的 image,并命名为docker.io/centos:apache
docker build -t docker.io/centos:apache ./
注: ./ 表示当前目彔。另外你的当前目彔下要包含 Dockerfile
---
输出以下内容:
Sending build context to Docker daemon 4.096 kB
Step 1 : FROM docker.io/centos:apache
---> 32841c77ee1d
Step 2 : MAINTAINER <wayne>
---> Running in bf14d34c5c3b
---> ec83963862fc
Removing intermediate container bf14d34c5c3b
Step 3 : RUN yum install -y httpd
---> Running in fe051fe11fed
CentOS Linux 8 - AppStream 330 B/s | 4.3 kB 00:13
CentOS Linux 8 - BaseOS 362 B/s | 3.9 kB 00:10
CentOS Linux 8 - Extras 98 B/s | 1.5 kB 00:15
Package httpd-2.4.37-43.module_el8.5.0+1022+b541f3b1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
---> 76c4e5460e51
Removing intermediate container fe051fe11fed
Step 4 : ADD start.sh /usr/local/bin/start.sh
---> fb02f26d0d2f
Removing intermediate container f668c879e7c4
Step 5 : ADD index.html /var/www/html/index.html
---> eac60ef4ec0c
Removing intermediate container b1f66abb4140
Step 6 : CMD echo hello word
---> Running in f9305acc3864
---> c0d852650423
Removing intermediate container f9305acc3864
Successfully built c0d852650423 #创建成功
查看images列表
docker images q
注意:docker镜像=应用/程序+库
六、镜像的发布
镜像的发布有两种方法
:
方法 1:Save Image To TarBall
方法 2:Push Image To Docker Hub
6.1 方法 一
保存 Image 成 tar 包
语法:docker
save
-o
导出的镜像名.tar
本地镜像名:镜像标签
保存镜像为tar的格式
docker save -o apache.tar docker.io/centos:httpd
查看保存的镜像
ll
例: 导入保存的镜像:
语法:docker
load
保存的镜像路径
-i
指定导入的文件,代替 STDIN。
-q
精简输出信息
删除现有的
docker rmi docker.io/centos:httpd
查看镜像
docker images
导入刚才创建的镜像:
docker load -i apache.tar
查看
docker images
6.2 方法二
发布到外网的Docker Hub
6.2.1 注册一个docker hub帐号**
https://hub.docker.com/
6.2.2 登录到dockerhub**
docker login -u userabc -p abc123 -e userab@gmail.com
6.2.3 上传镜像到docker hub**
docker push centos:httpd
6.2.4从docker hub下载镜像**
docker pull userabc/centos:httpd #用户名/镜像名
6.3 方法三 使用华为云的的SWR容器镜像服务来发布
七、Docker 的文件地址
可以通过rpm命令进行查看
rpm -ql docker
配置文件的说明
/etc/docker/daemon.json #配置加速地址
/var/lib/docker #镜像、容器等内容,其下的containers文件夹为容器文件夹,image为镜像文件夹
八、Container端口映射
启动container并映射80端口
语法:docker
run
-p
物理机的端口:容器实例的端口
-p
指定物理机的端口:容器实例的端口
-P
随机生成(物理机的端口:容器实例的端口)
docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh
查看容器映射的端口
docker ps
注意:
物理机的端口只能映射到容器内的某一个端口上
,如:8080:80之后,就不能8080:81
容器内的端口可以被物理机的多个端口映射
,如:8080:80,8081:80,8082:80