一款软件产品必须经过:开发 -> 上线
开发人员负责将应用程序开发制作出来。
运维人员负责上线,配置应用程序。
在这里存在一个问题:开发环境和上线环境不一致;可能会导致,开发人员在自己的电脑上可以正常运行代码,运维人员将服务程序上线到服务器后,由于环境不一致可能会导致运行失败,服务不可用。
如何解决上述问题?
Docker就是将开发环境和程序代码一起打包到服务器中运行的技术。
java语言 --> apk程序 --> 发布到应用商店 --> 客户下载apk --> 安装使用(必须要有环境才能安装成功)
java语言 --> jar环境 --> 打包项目和环境(镜像) --> 上传到docker仓库(商店) --> 下载仓库中的镜像 --> 运行使用
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker的核心思想就是来自集装箱;集装箱的概念是隔离货物,所以docker的核心就是隔离机制。同时docker使用可移植镜像所以部署以及运维极其方便快捷。
2010年,几个热爱IT的年轻人,在美国成立了一家公司叫做dotCloud,主要做一些Paas的云计算服务和LXC有关的容器技术赚钱盈利,他们将自己的容器技术命名为Docker!
Docker刚刚诞生的时候,并没有引起行业的注意!这个时候 dotCloud公司难以在行业中存活,所以这几个年轻人选择开放Docker源代码来引起注意!
2013年,Docker开源!越来越多的人发现docker的优点,在这一段时间docker每个月都会更新一个版本。
2014年4月9日,Docker1.0发布!
虚拟机:通过虚拟化技术模拟真实的硬件从而创建出来的一台拥有完整功能的逻辑计算机。
Docker容器:docker容器也是一种虚拟化技术,和传统虚拟化不一样的是docker只模拟一个程序最核心的运行环境,所以十分小巧,启动更快。
vm_vs_docker.png
对比 | 特点 |
---|---|
虚拟机 | 完整的系统功能,隔离性更好,占用空间大(通常以G为单位),运行占用资源较多,启动慢(分钟级启动) |
容器 | 只有程序运行的核心环境,不需要安装直接运行镜像即可,隔离性一般,十分小巧占用空间极小(一般以M为单位),启动快(秒级启动) |
docker_engine.png
docker_framework.png
Docker优势:
Docker用例:
镜像(image):docker镜像就好比是一个模板,可以通过这个模板来创建容器服务;一个镜像可以创建多个容器(应用运行在容器中)。
image_to_container.png
容器(container):docker容器可以独立运行一个或者一组应用程序;容器是由镜像创建出来的。
仓库(repository):docker仓库是存放镜像的地方;docker仓库分为公有仓库和私有仓库。docker默认仓库是Docker Hub。
Docker容器是镜像运行的实例。容器是在一个资源隔离的环境中运行应用程序和其依赖项的、轻量化的虚拟化技术。容器运行在独立的沙箱环境中,这保证了容器内的进程不会影响到容器外的任何进程。
名称空间: Docker通过名称空间机制为容器提供隔离的工作空间。
控制组: Linux可以通过控制组设置进程使用CPU、内存和I/O资源的限额。Docker引擎正是依赖这种底层技术来限制容器使用的资源。
联合文件系统: 可以将其他文件系统合并到一个联合挂载点。联合文件系统是实现Docker镜像的技术基础。Docker镜像可以通过分层来实现继承。
容器格式: Docker引擎将名称空间、控制组和联合文件系统打包到一起所使用的就是容器格式。默认的容器格式是Libcontainer。
Docker容器使用UnionFS(联合文件系统):
当docker容器加载镜像启动时,一个新的可写层被加载到镜像的顶部,这一层通常被称作“容器层”,“容器层”之下的都叫“镜像层”。所有对容器的改动,无论添加、删除、还是修改文件都只会发生在容器层中;只有容器层是可写的,容器层下面的所有镜像层都是只读的。
image_run.png
[root@167 ~]# cd /etc/yum.repos.d/
[root@167 yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1919 100 1919 0 0 4680 0 --:--:-- --:--:-- --:--:-- 4680
[root@167 yum.repos.d]# sed -i 's@https://download.docker.com@https://mirrors.tuna.tsinghua.edu.cn/docker-ce@g' docker-ce.repo
[root@167 yum.repos.d]# yum -y install docker-ce
docker-ce的配置文件是/etc/docker/daemon.json,此文件默认不存在,需要我们手动创建并进行配置,而docker的加速就是通过配置此文件来实现的。
docker的加速有多种方式:
[root@167 ~]# vim /etc/docker/daemon.json
[root@167 ~]# systemctl restart docker
[root@167 ~]# sudo systemctl daemon-reload
[root@167 ~]# sudo systemctl restart docker
[root@167 ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://fyc7gm7k.mirror.aliyuncs.com"]
}
[root@167 ~]# docker info
Registry Mirrors:
https://fyc7gm7k.mirror.aliyuncs.com/
//显示上面两行则说明添加成功
[root@167 ~]#
docker ps //查看容器运行状态
选项:
-a //显示所有的容器,包括未运行的
-q //只显示容器id
-l //显示最近创建的容器。
-f "筛选条件" //根据条件过滤显示的内容
示例:
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b2573716a20d hello-world "/hello" 9 minutes ago Exited (0) 9 minutes ago focused_perlman
CONTAINER ID //容器 ID
IMAGE //使用的镜像
COMMAND //启动容器时运行的命令
CREATED //容器的创建时间
STATUS //容器状态
状态有7种:
created(已创建)
restarting(重启中)
running(运行中)
removing(迁移中)
paused(暂停)
exited(停止)
dead(死亡)
PORTS //容器的端口信息和使用的连接类型(tcp\udp)。
NAMES //容器名称
docker inspect 容器名 //查看容器详细信息
示例:
[root@docker ~]# docker inspect test
......略........
docker run //从镜像运行一个容器
选项:
--name //指定容器的名称,如果不指定随机给容器生成一个名称
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端,不建议run时使用
-d //容器以守护进程的方式运行
-p 宿主机端口:容器端口 //将宿主机端口映射给容器端口
-v 宿主机目录:容器目录 //将宿主机目录挂载到容器中;直接写容器目录省略宿主机目录,将在宿主机自动创建一个目录挂载到容器中
--user uid:pid //将宿主机用户和组映射至容器中
-e //启动容器时传递环境及其值
--rm //容器退出时删除容器
--cpuset-cpus CPU序号 //容器能够使用哪些物理cpu
--cpu-shares 数值 //CPU共享权值(相对权重)
--memory 数值 //容器内存限制,单位b,k,m,g
--memory-swap 数值 //容器内存+交换分区大小,不能小-m的值
--restart 策略 //指定容器停止后的重启策略
no //容器退出时不重启
on-failure //容器故障退出(返回值非零)时重启
on-failure:3 //在容器非正常退出时重启容器,最多重启3次
always //容器退出时总是重启
unless-stopped //在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
--network 网络名称 //容器网络设置
bridge //使用桥接模式
host //容器使用主机的网络
container:NAME_or_ID //使用其他容器的网路,共享IP和PORT等网络资源
none //容器使用自己的网络(类似bridge);但是不进行配置,如分配veth pair 和网桥连接,配置IP等
--link 容器名称 //指定容器间的关联,可以和指定容器进行通信
示例:
//使用nginx镜像启动一个名为nginx00的容器
[root@docker ~]# docker run --name nginx00 nginx
.....略......
//使用nginx镜像启动一个名为nginx01的容器并分配一个bash shell的终端进入容器
[root@docker ~]# docker run --name nginx01 -it nginx /bin/bash
root@a4f41fb35ac3:/#
root@a4f41fb35ac3:/# exit
注意:
1.指定-it选项为容器分配shell后,启动容器时运行的命令将会被shell替代
2.不加-d选项的容器一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
//使用nginx镜像启动一个名为nginx02的容器并在后台运行
[root@docker ~]# docker run --name nginx02 -d nginx
87dd1b06a58a87921178503024bfdfba79b0b80902606fc7bcccfce67939c6bc
//使用nginx镜像启动一个名为nginx03的容器,该容器在后台运行,访问宿主机的8080端口可以访问到容器的80端口
[root@docker ~]# docker run --name nginx03 -d -p 8080:80 nginx
9b2fa686b4aee04a7d564b6bf627b459e4aab43ca2b5b47ab590ee8e4ebd89f5
//查看所有容器状态
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9b2fa686b4ae nginx "/docker-entrypoint.…" 23 minutes ago Up 19 minutes 80/tcp nginx03
87dd1b06a58a nginx "/docker-entrypoint.…" 42 minutes ago Up 27 minutes 80/tcp nginx02
a4f41fb35ac3 nginx "/docker-entrypoint.…" 49 minutes ago Exited (0) 4 seconds ago nginx01
asdasd06a58a nginx "/docker-entrypoint.…" 59 minutes ago Exited (0) 4 seconds ago nginx00
docker start 容器名 //开启容器
docker stop 容器名 //停止容器
docker kill 容器名 //杀死容器
docker restart 容器名 //重启容器
docker pause 容器名 //暂停容器中所有的进程
docker unpause 容器名 //恢复容器中所有的进程
docker stats 容器名 //查看容器使用资源信息
docker top 容器名 //查看容器中运行的进程信息,支持ps命令参数
docker port 容器名 //查看宿主机端口和容器端口之间的端口映射
//当容器创建失败时,因为容器没有启动成功则无法看到错误日志,无法判断问题所在,下面命令可以查看日志,不管容器时候启动成功
docker logs 容器名 //获取容器的日志信息
选项:
-f //跟随打印最新的日志追加在最后面
-t //显示日志打印的时间戳
--tail 数量 //只显示最新的指定数量的几条日志信息
docker attach 容器名 //连接到正在运行的容器进程中,默认连接到容器启动时启动的进程
示例:
//连接到nginx02容器中的nginx进程,此时可以看到nginx工作日志
[root@docker ~]# docker attach nginx02
172.17.0.1 - - [27/Apr/2021:16:21:11 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.61.1" "-"
注意:使用attach连接到容器容器进程,一旦终止容器内的进程,容器就终止运行
//如果容器启动时运行的命令是shell进程,则连接shell终端
[root@docker ~]# docker attach nginx01
root@9b2fa686b4ae:/#
root@9b2fa686b4ae:/# exit
exit
注意:使用attache连接到容器的shell一旦使用exit退出容器shell,容器就终止运行;ctrl+p+q可以退出shell,容器仍将继续运行
docker exec 容器名 执行命令 //不进入容器执行容器中的命令
选项:
-d //后台执行,不显示结果
-it //为容器分配一个始终运行的伪终端,需要指定shell;-i保持运行状态,-t是分配伪终端
示例:
//不进入容器执行容器中的ls命令
[root@docker ~]# docker exec nginx03 ls
bin
boot
dev
......
//使用docker exec命令打开一个shell进入到容器中,使用exit退出shell,容器也不会终止运行
[root@docker ~]# docker exec -it nginx03 /bin/bash
root@87dd1b06a58a:/#
root@87dd1b06a58a:/# exit
exit
docker cp 容器名:容器文件路径 宿主机路径 //将容器中的文件复制到宿主机中
docker cp 宿主机路径 容器名:容器文件路径 //将宿主机中的文件复制到容器中
示例:
//将容器中的nginx配置文件复制到宿主机
[root@docker ~]# docker cp nginx03:/etc/nginx/nginx.conf /root/
[root@docker ~]# ls
Documents Music Public Videos initial-setup-ks.cfg
Desktop Downloads Pictures Templates anaconda-ks.cfg nginx.conf
docker export 容器名 > 导出的容器文件名 //容器导出
docker import 导出的容器文件名 镜像:标签 //容器导入,导入之后只会生成镜像
示例:
//将nginx01容器导出为/tmp/nginx-hzz文件
[root@docker ~]# docker export nginx03 > /tmp/nginx-zwl
//将导出的容器导入为镜像,名字叫nginx-zwl:zwl
[root@docker ~]# docker import /tmp/nginx-zwl nginx-zwl:zwl
sha256:e46da7739eede49b1f2aa5851f8c75a700d1159a69daa05427b65b3619d88353
docker rm 容器名 //删除容器,无法删除运行状态下的容器
选项:
-f //强制,可以删除运行状态下的容器
示例:
//删除nginx01容器
[root@docker ~]# docker rm nginx01
nginx01
//批量删除所有容器
[root@docker ~]# docker rm `docker ps -qa`
9b2fa686b4ae
a4f41fb35ac3
的容器导入为镜像,名字叫nginx-zwl:zwl
[root@docker ~]# docker import /tmp/nginx-zwl nginx-zwl:zwl
sha256:e46da7739eede49b1f2aa5851f8c75a700d1159a69daa05427b65b3619d88353
docker rm 容器名 //删除容器,无法删除运行状态下的容器
选项:
-f //强制,可以删除运行状态下的容器
示例:
//删除nginx01容器
[root@docker ~]# docker rm nginx01
nginx01
//批量删除所有容器
[root@docker ~]# docker rm `docker ps -qa`
9b2fa686b4ae
a4f41fb35ac3