docker是一个使用容器技术跨平台一键部署服务的工具,容器在一开始就把全部的配置文件都准备好,开箱即用,不需要考虑任何依赖项的问题,因为里面包含了启动服务的最少依赖项,或者叫满足容器服务的最小的操作系统。
一、容器与镜像
什么是docker容器?什么又是docker镜像?这两个有什么区别?
举个栗子🌰:镜像可以相当于开发者已经打包好的安装包,用户只要点击安装即可完成软件的安装,则安装好的那个软件就是叫做容器了。容器是可运行的docker“程序”。
二、docker与虚拟机的区别
看到这里,想必大家会把容器技术和虚拟化技术作类比。那docker和虚拟机有什么区别呢?
1、环境不同
docker使用的是相对隔离的环境,大部分配置都是在docker内的容器设置的,但是容器和主机则是有部分联系的,如卷和网络,并且多个容器之间可以配置是否可以互相访问,有利于数据共享。这样做的好处即可让部分数据于主机交互,又可以保障容器内部的破坏不能直接影响到主机。
虚拟机使用的是绝对隔离的环境,通过虚拟化技术虚拟出硬件,虚拟机和物理机没人任何的数据共享。
2、内核不同
docker是与物理机公用同一个内核,但是它不能直接访问物理机内核,而是通过docker引擎访问,这样做的好处就是优化容器内部的性能
3、资源分配不同
虚拟机是在一开始就分配好了资源大小,无论虚拟机内部是否够用,也不能增添性能;而docker则是用多少取多少,是弹性资源分配,这样做的好处就是能够减少资源的浪费和开销。
4、配置数据可保留
docker容器可以设定让容器内部指定数据挂载到外部主机的文件夹,这样做的好处就是即使将整个容器被摧毁,也能保留配置文件,下次直接创建新的容器即可使用指定的配置文件。
三、添加国内镜像源
因为docker官方的镜像仓库是在国外的,在国内因为不可抗力因素通常访问速度很慢或者无法访问,此时就需要使用国内docker镜像源来加快docker仓库的访问速度,要么就使用科学上网来解决这个问题。
在iStoreOS添加docker镜像源
使用ssh连接到iStoreOS的后台,输入vi /etc/docker/daemon.json编辑文件(默认没有则会自动创建),
添加如下配置:
{
registry-mirrors:[
#镜像源失效了的话需要更改下面的链接
https://docker.m.daocloud.io
]
}
按Esc后输入:wq保存,重启docker服务/etc/init.d/dockerd restart即可生效
这里提供一个国内可用的docker镜像源收集站:点我打开
四、docker常用命令
参考文章:Docker容器常用操作命令详解
1、下载镜像
docker pull 镜像名
2、查看全部镜像
docker images
3、查看正在运行的容器
docker ps
docker ps -a 可以显示全部容器,包括未运行的容器
4、运行容器
docker run [参数] 镜像名
开头
-d: 后台运行容器并返回容器 ID。
-it: 交互式运行容器,分配一个伪终端。
--name: 给容器指定一个名称。
-p: 端口映射,格式为 主机端口:容器内部端口。
-v: 挂载卷,格式为 主机目录:容器内部目录。
--rm: 容器停止后自动删除容器。
--env 或 -e: 设置环境变量。
--network: 指定容器的网络模式,通常为--network host。
--restart: 容器的重启策略(如 no、on-failure、always、unless-stopped)。
-u: 指定用户。
5、进入容器内部的shell
#先用docker ps查看容器
docker exec -it 容器名/id /bin/bash
6、启动、停止、重启容器
docker [start|stop|restart] 容器名/id
7、删除镜像
#先用docker images查看全部镜像
docker rmi c
8、删除容器
#需要停止容器后才能删除
docker rm 容器名/id
-f 强制删除正在运行的容器
五、docker网络
docker网络主要分为3种类别:桥接型Bridge,主机型Host,无网型None
1、桥接型Bridge
当安装完成docker的时候我们的网络配置会多以来一个docker网络,这个网络就是内docker容器运行容器分配的一个内部私有网络(虚拟路由),一般是172.17.0.1/16。docker容器会默认使用这个docker的桥接网络来与互联网相连,相当于进行了一层NAT转换。
通常来说我们外部设备是无法使用docker网络直接访问docker容器的(docker本机除外),因为外部设备无法连接到docker网络(类似于NAT),因此要想外部设备能够访问到容器端口,需要将内部端口暴露出来(类似于端口映射),-p 外部端口:内部端口。
2、主机型Host
桥接型网络有个不好的地方就是每次都需要指定的端口暴露出来,假如说有一个容器需要用到开放多端口(如p2p),显然一个一个端口开放必然是非常麻烦的,这时候我们就需要用到host网络了。
Host网络就是docker主机自身的网络,容器不再使用docker网络,而且直接桥接到主机的实际网络,相当于容器变成的主机的一个应用(仅在linux下如此),这样做的优点就是不需要考虑暴露内部的多少端口,因为内部端口等于外部端口,但这样也带来一系列问题:
- docker端口冲突:因为内部端口等于外部端口,这样的话导致主机的端口会有冲突,除非修改主机或者容器的开放端口,有时候你无法找到容器对应的配置,只能修改主机的服务端口,这样不利于管理。
- 不安全的网络:因为开放过多的端口,并且容器内部可以直接访问主机的全部开放服务,从而导致网络安全方面的问题。
3、无网型None
None网络比较简单,容器内部只有一个回环网络LOOPBACK,甚至连主机自身也不能同docker网络连接到该容器,只能使用docker exec -it 容器名/id /bin/bash进入容器内部。
六、docker-compose
当我们需要部署多个docker容器并且让其互相联通,一个一个容器部署的话是非常麻烦的,这时候使用docker-compose就可以一键部署多个容器了,
1、安装docker-compose
①文件:本地下载
Github链接:docker-compose-linux-x86_64
#直接从Github下载
wget https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-linux-x86_64
#或者从作者自建网盘复制链接后下载
wget 复制的链接
②移动到/usr/bin/目录下
mv docker-compose-linux-x86_64* /usr/bin/docker-compose
③修改权限
chmod 775 /usr/bin/docker-compose
④查看docker-compose是否安装成功
docker-compose version
2、简单使用docker-compose
docker-compose使用的是配置文件生成容器,因此需要有一个docker-compose.yml文件
这里简单创建一个docker-compose构建nginx-proxy-manager-zh容器示例:
#先创建文件夹
mkdir -p /data/nginx-proxy-manager-zh
#进入该文件夹
cd /data/nginx-proxy-manager-zh
#创建docker-compose.yml文件
vi docker-compose.yml
#粘贴官方的配置文件
services:
app:
image: 'docker.io/jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
#开放端口
- '80:80'
- '81:81'
- '443:443'
volumes:
#共享卷./data表示当前目录
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
#启动容器
docker-compose up -d
3、对比docker创建命令
docker run -d \
--restart unless-stopped \
-p 80:80 \
-p 81:81 \
-p 443:443 \
-v ./data:/data \
-v ./letsencrypt:/etc/letsencrypt \
jc21/nginx-proxy-manager:latest
是不是docker-compose的更加简单明了呀?
这里只是简单使用了一下docker-compose,它的优势要在多容器同时部署的时候才能该体现出来。