docker入门实践
一、docker中的基本概念1、什么是容器?容器是一个标准的软件单元,它打包代码及其所有依赖项,以便应用程序从一个计算环 境快速可靠地运行到另一个计算环境。Docker 容器镜像是一个轻量级的、独立的、可执行的软件包,包括运行应用程序所需的一切:代码、运行时、系统工具、和设置。2、docker和虚拟机的区别?...
目录
二、docker的安装和使用(CentOS Linux release 7.9.2009)
1、卸载旧的docker的版本(如果没装过的就不需要这一步了)
2、安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库
compose的好处: 1.快速批量启动容器,效率高 2.不容易出错,可靠
一、docker中的基本概念
1、什么是容器、镜像和仓库?
容器(container)是一个标准的软件单元,运行镜像的地方、背后就是起到一个进程来运行镜像,docker就是一个容器管理的软件(平台)。
镜像(image):镜像就是打包好的软件,程序代码、基础系统、依赖关系的软件包等等、西需要人去制作。
仓库(repository):集中存放镜像的地方
2、docker和虚拟机的区别?
容器和虚拟机具有相似的资源隔离和分配优势,但功能不同,因为容器虚拟化的是操作系统而不是硬件。容器更便携、更高效
docker的优势:启动速度快、资源消耗小(资源可以控制、共用宿主机的内核,基础镜像消耗内存少)、扩展方便(HPA)
docker的缺点:APP隔离这一块没有虚拟机彻底,层次不一样、虚拟机的的隔离级别是操作系统级的,而容器的隔离级别是进程级的,进程之间很容易通信
对比图
3、docker的底层隔离机制?
name space:命名空间
Namespace是内核的一个功能。用来给进程隔离一系列(网络、进程、文件系统)系统资源的。
命名空间的种类:
- 网络命名空间
- IPC命名空间
- 挂载命名空间
- UTS命名空间
- 用户命名空间
control groups:对资源进行限制,例如CPU、内存、磁盘等等。
最初叫process groups ,顾名思义,就是将进程放到一个组里进行统一控制,后改名control groups(cgroups是它的缩写),它为资源管理提供了一个统一的框架
二、docker的安装和使用(CentOS Linux release 7.9.2009)
1、卸载旧的docker的版本(如果没装过的就不需要这一步了)
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2、安装yum-utils包(提供yum-config-manager 实用程序)并设置稳定的存储库
yum install -y yum-utils
#这是官方的源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
#国内源,速度快一点
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
3、安装 Docker 引擎
yum install docker-ce docker-ce-cli containerd.io
到这一步,你的docker已经安装完成了,但是你还需要启动自己启动docker,并且可以试着运行一个命令
#启动docker
systemctl start docker
#设置开机自启动
systemctl enable docker
systemctl enable containerd
#运行一个hello-world 试试
docker run hello-world
4、卸载
#卸载 Docker 引擎、CLI 和 Containerd 软件包
yum remove docker-ce docker-ce-cli containerd.io
#主机上的映像、容器、卷或自定义配置文件不会自动删除。要删除所有映像、容器和卷
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
三、docker中的一些基本命令和问题
#查看docker的版本
docker version
#查看你在docker中下载了哪些镜像
docker images
#搜索镜像(nginx)可以从哪里拉取
docker search nginx
#拉取镜像
docker pull nginx
#查看有哪些容器正在运行
docker ps
#查看详细信息(容器、网络、volume)
docker network inspect bridge
docker container inspect nginx
#查看网络类型
docker network ls
#开起或者停止和删除一个镜像
docker stop(start、rmi)
#运行一个容器 -d(表示后台运行) -p(端口映射) --name(容器的名字) 最后接要使用的镜像
#--cpu-share 限制容器可以使用的的CPU,-m(限制容器可以使用的内存资源,单位byte),如果一个容超出了限制,会被docker软件重启
docker run -d -p 80:80 --name --cpu-shares 30 -m 1000000 chen-nginx nginx
#查看容器启动的过程中的日志,排错使用
docker logs
#查看容器的节点
docker node ls
#创建一个服务
docker create service
# 查看容器内部的进程,后接容器名
docker top
#进入容器,运行bash程序 -i(interactive) 交互式方式进入容器 -t(tty) 开启一个终端,exit(退出容器),进入容器很多命令不能使用是因为没有安装
docker exec -it chen-nginx /bin/bash
镜像的导入导出的方式
#导出镜像,压缩打包成nginx.tar文件
docker save -o nginx.tar nginx
# 导入镜像
docker laod -i nginx.tar
#动态导出一个正在运行的镜像
docker export -o nginx.tar my_nginx
# 导入一个正在运行的镜像
docket import nginx.tar
#docker commit :从容器创建一个新的镜像
-a :提交的镜像作者;
-c :使用Dockerfile指令来创建镜像;
-m :提交时的说明文字;
-p :在commit时,将容器暂停
docker commit -a "runoob.com" -m "my apache" a404c6c174a2 mymysql:v1
容器的三种状态:
- up
- created
- exited
创建一个服务和创建一个容器的区别?
使用run命令创建一个container,是为单主机的解决方案构建的,一次只能创建一个容器,
没有扩大/缩小的概念
而使用docker create service 创建服务主要是用于swarm集群中,使用--replicas()可以一次
创建很多的副本,也就是多个服务,而且使用docker create service 创建服务还有一个好处就
是当其中容器出现问题之后它会自动帮我们重新创建容器,保持副本的数量,而docker run 就没有
这个功能
在需要创建多个服务的(群组模式下)使用docker create service ,单主机模式使用 docker run
容易出现的一些故障及解决方式
连接不到容器:有可能是网络问题导致的,虚拟机挂起之后再开最好重启一下docker服务
容器上不了网:查看一下是否打开了路由功能
#临时开起路由功能
echo 1 >/proc/sys/net/ipv4/ip_forward
#永久开起
vim /etc/sysctl.conf
末行添加net.ipv4.ip_forward=1
docker logs chen-nginx :查看日志,启动不了的原因
四、数据持久化-数据共享-volume
正常停止容器,容器里的数据不会丢失,会保存在 /var/lib/docker/volumes/文件下
修改了容器对应的配置文件通过重容器来使配置文件生效
1、数据卷
卷是保存由 Docker 容器生成和使用的数据的首选机制
实现容器和宿主机之间共享数据
卷比绑定挂载更容易备份或迁移
创建和管理卷
#创建卷
docker volume create my-vol
#查看卷
docker volume ls
#查看卷的详细信息
docker volume inspect my-vol
#删除卷
docker volume rm my-vol
卷的使用
一般有两种方式 -v 和 --mount
#第一种
docker run -d \
--name devtest \
-v my_vol:/app \
nginx:latest
#第二种
docker run -d \
--name devtest \
--mount source=my_vol,target=/app \
nginx:latest
使用卷来启动服务
docker service create -d \
--replicas=4 \
--name devtest-service \
--mount source=my_vol,target=/app \
nginx:latest
# 查看服务是否运行
docker service ps devtest-service
#删除服务将停止所有的任务,但是不会删除卷
docker service rm devtest-service
#运行这些示例中的任何一个后,运行以下命令来清理容器和卷。注意卷删除是一个单独的步骤
docker container stop nginxtest #停止容器
docker container rm nginxtest #删除容器
docker volume rm nginx-vol # 删除卷
#删除所有卷
docker volume prune
五、容器的网络类型
所有容器上网都需要经过有宿主机,底层使用的是iptables 的SNAT和DNAT
前四种:
- bridge(桥接)
- host:容器和宿主机共享ip地址,端口号要区别开
- null模式:只有io接口,没有其他接口
- container模式:很多容器共享一个IP地址(k8s)
以上四种模式,只是考虑宿主机和容器之间的通信,在同一台机器里
第五种:overly
overly网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消
息进行加密,实现跨主机的docker容器之间的通信,底层原理是VXLAN
overly网络实际上是目前最主流的容器跨节点数据传输和路由方案
#namespace 命名空间: 一个隔离的空间,里面可以存放数据
#创建一个命名空间
docker network create --driver bridge sc
#创建一个容器使用新建的命名空间
docker run -it -d --name fan-centos-1 --network sc centos:7
#不同命名空间的容器之间不能通信
#创建一个网络命名空间,相当于在宿主机里创建了一个接口,会配置ip地址
六、镜像的制作
1、镜像的原理
base镜像:提供的是最小安装的linux发行版
scratch:该镜像是一个空的镜像,可以用于构建busybox等超小镜像
bootfs:容器启动的时候需要的内容
分层的思想:镜像的层数可能会有很多,所有的镜像层会联合在一起组成一个统一的文件系统。
copy-on-write
容器层保存的是镜像变化的部分,不会对镜像本身进行任何修改。
所有对容器的改动 - 无论添加、删除、还是修改文件都只会发生在容器层中。
容器启动的时候,内核启动bootfs后直接将基础镜像加载,然后一层一层的加载--》自下而上
容器运行后访问文件的时候,从上而下,从可写层,一层一层往下访问
1.添加文件
在容器中创建文件时,新文件被添加到容器层中。
2.读取文件
在容器中读取某个文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,打开并读入内存。
3.修改文件
在容器中修改已存在的文件时,Docker 会从上往下依次在各镜像层中查找此文件。一旦找到,立即将其复制到容器层,然后修改之。
4.删除文件
在容器中删除文件时,Docker 也是从上往下依次在镜像层中查找此文件。找到后,会在容器层中记录下此删除操作。
2、dockerfile
Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明.
以制作一个nginx镜像为例:
#FROM命令就是指定基础镜像
FROM nginx
RUN echo 'we are running some # of cool things'
#RUN命令就是用于执行后面跟着的命令行命令,有两种形式
RUN <命令行命令>
RUN ["可执行文件", "参数1", "参数2"]
RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline
#Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
构建镜像:docker build -t nginx:v3 . 点表示通过当前目录下的Dockerfile文件创建
指令详解
COPY:复制指令,从上下文目录中复制文件或者目录到容器里指定路径
ADD:ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似
- ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
- ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
CMD:
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
- CMD 在docker run 时运行。
- RUN 是在 docker build。
WORKDIR-:切换当前执行的工作目录
ENTRYPOINT:
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序
ENV:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。
VOLUME:指定容器挂载点到宿主机自动生成的目录或其他容器
七、多容器之间的连接
--link
docker run -d -p 7702:80 --name schello3 --link sc_redis:redis schello2
#sc_redis:redis sc_redis是容器名 redis是hosts文件里的主机名
容器之间可以使用主机名访问
主动链接的容器绘制到被链接的容器的信息:ip和端口
在容器的hosts文件里添加名字对应的IP地址
e9b9c4a2077b3]# cat hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.10 redis add142e7eb43 sc_redis
172.17.0.11 3a43e6e2cdf0
常见文件的作用
- config.v2.json 存放容器配置的数据
- resolve.conf 容器里的dns服务器的地址使用的是宿主机里的dns的配置
- hostname 存放主机名的
- hosts 域名解析
- var/lib/docker/containers 存放容器的目录
八、compose
Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用Docker Compose不再需要使用shell脚本来启动容器。
Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。
compose的好处:
1.快速批量启动容器,效率高
2.不容易出错,可靠
缺点:只能在一台宿主机上编排容器
安装
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
#对二进制文件授予可执行权限
chmod +x /usr/local/bin/docker-compose
测试
[root@localhost Dockerfile]# docker-compose --version
docker-compose version 1.29.2, build 5becea4c
更多推荐
所有评论(0)