开发人员要学的Docker从入门到日常命令使用(通俗易懂),专业运维人员请勿点!
一、介绍Docker
1.引言
问题1:开发人员告诉测试说自己的项目已经做好了,给你一个发布包,你去测试吧。
## 测试人员,为什么我运行会报错?
## 开发人员说,我本地运行没有问题呀!
解答***环境问题
问题2:一台linux服务器,多个同事一起使用,突然有个同时在程序不小心写了一个死循环,导致linux卡死!
解答**多用户使用linux时,隔离问题
问题3:天猫双十一,用户爆发性增长,需要扩展很多台服务器。
如果双十一部署几百台、几千台服务器,公司运维一台台部署,调试环境,可以累死,运维成本高。
解答****docker可以实现弹性伸缩,快速扩展。降低运维成本,一个命令,快速部署上百台服务器。
2.Docker概述
2.1 Docker的由来
一帮年轻人,开了一家公司,2010年的时候做pass平台。
当时所罗门这个公司发展的特别好。
到了2013年,亚马逊,谷歌,微软也开始做pass平台,
业务被互联网巨头抢走了,所罗门为了不让自己三年的技术白费,讲pass平台的核心技术进行开源,这个技术就是docker
后来,开源的docker被业界人士认可,后期得到了融资,于是该团队专门做docker的维护与升级工作。
这个是docker的作者之一,
后来docker的主要作者离开了团队,原因是朋友的公司却少CEO
当时这个作者想的是 docker维护的非常好了,有我没我都一样了,于是就走了。就如目前的python创始人一样,
现在python社区也是很棒的。
3 Docker的思想
1.集装箱
将所有需要的环境,全部放到一个集装箱中,谁需要使用这个环境,直接拿到这个集装箱就可以了。
集装箱的专业术语就是镜像,可以理解为把代码打包成一个压缩包
2.标准化
一、运输的标准化:docker有一个超级码头,所有的集装箱都放在这个超级码头里面,谁需要直接去获取即可。
超级码头理解成一个仓储,里面有很多镜像
二、运行方式标准化:docker提供了统一的命令,可以直接通过命令去码头搬运自己需要的集装箱。
三、提供了REST的API:docker有一个REST API,可以实现图像化界面操作,Rancher就是一种。
3.隔离性
docker在运行集装箱的内容时,在linux内核中开辟了一个独立的空间,用来运行集装箱的内容。
二、安装Docker
1.安装依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
2.设置下载docker的镜像源,提高速度
# yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum makecache fast
3.安装docker社区版
# yum install -y docker-ce
4.启动docker并设置开启自动启动
# systemctl start docker
# systemctl enable docker
5.运行docker的hello-world镜像进行测试 是否安装成功。
# docker run hello-world 如果电脑网络不好,会导致拉取失败。因为本地没有这个镜像,需要去外网拉取
三、Docker的镜像操作
1、注册中心的选择
http://hub.daocloud.io https://hub.docker.com .....拉取镜像的网站
2、拉取镜像到本地
docker pull 镜像[:tag] # 拉取镜像
docker pull daocloud.io/daocloud/helloworld-go:latest #去daocloud.io 拉取的方式
如果公司有私服,可以去公司的地址下载
docker pull 192.168.1.11:5000/.net-core:2.2.26
如果在公司拉取镜像失败,可以手工创建一个daemon.json
vim /etc/docker/daemon.json
{
"registry-mirrors":["https://registry.docker-cn.com"],
"insesure-registries":["192.168.1.11:5000"]
}
#成功后并重启
systemctl daemon-reload
systemctl restart docker
3、镜像的操作
docker images #查看全部的镜像
docker rmi 镜像id #删除镜像id
4、镜像的导入导出
docker save -o /usr/local/mysite.tar mysite:1.0 # 导出mysite:1.0到 /usr/local/下的mysite.tar 注意导出的格式是tar
docker load -i mysite.tar # 可以将此tar发给其他人,然后通过此tar包,完成镜像的加载,等价于 "docker pull ....."
5、Daocloud
这个地址是国内的,网速很快。访问官网并注册,然后在terminal中下载daocloud中的镜像:
docker login daocloud.io #在终端登录
docker pull 镜像名:tag # 在daoclod官网中搜索镜像,复制镜像名和tag,就可下载镜像
四、Docker容器的操作
一个镜像可以启动多个容器,每个容器都独立运行,容器间互相隔离。
即,一个运行成功的镜像,叫做容器。一个镜像可以多次运行,产生多个容器
1、运行镜像
docker run 镜像id #直接运行容器,并占满整个界面
docker run -d 镜像的id #后台运行
docker run -d -p 宿主机端口:容器端口 镜像id #运行容器的同时,让容器的端口映射宿主机的端口
docker run -d -p 宿主机端口:容器端口 --name 容器名称 镜像id #运行容器的同时,指定容器名称
2、查看容器
docker ps #查看正在运行的容器
docker ps -a #查看全部的容器,包括没有在运行的
docker ps -qa #查看全部容器的id
docker exec -it 容器id bash #进入容器的命令行中。
进入 之后的状态 root@c766775hgj87:/usr/local/iis/webapps/# ls
docker cp .net-core.tar c766775hgj87:/usr/local/iis/webapps/ #把linux的 .net-core.tar 复制到容器里面。
exit #退出容器命令界面
3、查看容器日志
docker logs -f 容器的id #由于后台启动,无法查看日志,使用此命令,可以查看后台容器日志
4、容器的停止和删除
docker stop 容器id #停止容器
docker stop $(docker ps -qa) #停止全部容器
docker rm 容器id #删除容器
docker rm $(docker ps -qa) #删除全部容器
五、数据卷
通过exec进入到容器的terminal中后,发现容器中的Linux发行版和咱们使用的不一样。
因为容器是纯净的,进入之后,无法使用vim等命令,需要容器里面更新安装,这些很占内存,并且时间也很漫长。
数据卷的存在成功的解决了这个问题,讲宿主机的目录映射到容器的一个目录,然后宿主机的目录和容器中的目录是同步的,这就可以在宿主机进行文件的编辑。在容器中文件也会实时的变动。
#在启动项目时,直接指定数据卷 volume
docker run -d -p 宿主端口:容器端口 --name 容器名称 -v 数据卷名称:容器指定的路径 镜像id
#如果宿主数据卷不存在,默认存放到了 /var/lib/docker/volumes/数据卷名称/_data/
#如果数据卷存在的话,启动容器
docker run -d -p 宿主端口:容器端口 --name 容器名称 -v 数据卷全路径:容器指定的路径 镜像id
#举个例子
docker run -d -p 8080:8080 --name IIS -v /var/lib/docker/volumes/数据卷名称:容器指定的路径 镜像id
---------常用命令----------
#如果事先创建数据卷,会造成最开始容器目录和数据卷无法同步---尽量不要单独创建
docker volume create 数据卷名称
#删除数据卷
docker volume rm 数据卷名称
#查看全部的数据卷
docker volume ls
#查看数据卷的详细信息
docker volume inspect 数据卷名称
**数据库安装
这里 我们安装一个Mysql 这个安装快捷
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --name mysql daocloud.io/library/mysql:latest
六、自定义镜像(Dockerfile)记住D是大写的
为了部署项目,需要单独的启动一个dotcore的容器,并且手动将发布包复制到指定的数据卷位置。
部署完毕,需要执行命令运行dotcore项目,dotnet webapp.dll
Dockerfile -> 是自己创建的一个文件
form 依赖的镜像路径
copy 将你宿主机的内容复制到容器中一份
workdir 容器会在你指定的路径
cmd 需要执行的命令(在workdir中执行指定的命令,cmd可以写多个,但是以最后一个为准 )
1、部署netcore
准备一个发布包
2、编辑Dockerfile
from docker.io/microsoft/aspnetcore #下载依赖的镜像文件 copy webapp /usr/local/ #当前根目录有个发布包 叫webapp 复制到容器里面的/usr/local/下 expose 8080 #表示暴露出来的端口号,和容器的端口号对应。这里默认是80。 workdir /usr/local/ #表示你的asp.net core web应用放在容器的哪个目录,这里是/usr/local目录,没有会自动创建 cmd ["dotnet","webapp.dll"] #表示执行的命令,即运行我们自己的asp.net core web程序
3、在widows编辑好Dockerfile编辑好之后,扔到linux中
4、构建自定义镜像
docker build -t 镜像名:tag #一定要在Dockerfile的当前目录下执行,并且asp.net core 也在当前目录
5、运行构建的镜像
docker run -d -p 宿主端口:容器端口 --name 名称 镜像id
七、Doker-Compose
将运行容器时,需要的全部配置都写在一个固定的docker-compose.yml文件中
Docker-Compose 可以批量管理容器
1、下载并安装DockerCompose
1.去github上下载docker-compose可执行文件
wget https://github.com/docker/compose/releases/down/1.24.1/docker-compose-Linux-x86_64
2.修改名字
mv docker-compose-Linux-x86_64 docker-compose
3、修改docker-compose的权限
chmod 711 docker-compose
4、将docker-compose 移动到 /usr/local/docker-compose/bin
mkdir -p /usr/local/docker-compose/bin
mv docker-compose /usr/local/docker-compose/bin
5、配置环境变量
vi /etc/profile
Shift +G 跳转到最后一行
export PATH=$JAVA_HOME/bin:/usr/local/docker-compose/bin:$PATH
保存并退出
输入 source /etc/profile
6、在任意目录输入 docker-compose
2、准备一个针对管理MYSQL的yml文件
建立一个目录,然后进入该目录,在该目录编辑yml文件
mkdir compose_mysql
cd compose_mysql
vim docker-compose.yml
注意问题:
1、yml文件是不允许编辑制表符 \t tab键 可以敲空格键
2、容器越来越来多注意端口、容器服务器命名问题。
启动docker-compose管理的容器
docker-compose up -d #启动docker-compose管理mysql
docker-compose down #关闭docker-compose管理mysql
3、通过Dockerfile和docker-compose定义自定义镜像
1、定义docker-compose.yml
version: '6.6' services: app: restart:always build: context: ../ #指定Dockerfile所在的路径 dockerfile:Dockerfile #指定Dockerfile的名称 image:app:1.2 #指定镜像的名称 container_name:app #容器名称 ports: - 80:80 #端口号 environment: TZ:Asia/Shanghai
2、定义Dockerfile
from docker.io/microsoft/aspnetcore copy app /usr/local/ workdir /usr/local/ cmd ["dotnet", "app.Web.dll"]
3、将准备好的内容丢到LInux并执行命令
docker-compose up -d #构建镜像并允许容器
4、docker-compose的常用命令
docker-compose up -d #允许docker-compose管理的内容名
docker-compose down #关闭,并删除容器
docker-compose stop #停止允许容器
docker-compose start #启动已经存在的容器
docker-compose ps #查看docker-compose管理的全部容器
docker-compose logs -f #查看docker-compose管理的容器和日志
注释:上面的命令是你管理当前路径的yml目录的容器,如果你在其他路径建立的yml,需要进入到该路径进行运行。
以上命令,开发人员学会了,就可以了。不需要学习太深,更专业的底层交给运维人员去处理就行了。