Docker入门
文章目录
- Docker入门
一.简述
1. Docker是什么
- Docker是基于Go语言实现的云开源项目,诞生于2013年初,最初是dotCloud公司发起。
- Docker通过对应用组件的封装、分发、部署、运行等生命周期的管理,达到应用组件级别的“一次封装,到处运行”。这里应用组件,即可以是Web应用,也可以是一套数据库服务,甚至是一个操作系统或编译器。
2. Docker作用
-
快速搭建重复环境
案例一
前几天,公司一批服务器就要到期了,由于服务器是15年购买的,硬件的性能远比现在新出的云主机低,因此决定把所有服务器都换成新一代服务器,但是正准备动手迁移服务器时,内心一阵阵崩溃感涌上心头,仔细一算,每台服务器都要做同样的事情。安装jdk,tomcat,nginx,设置jdk环境变量。。。后来决定用docker部署的办法,在每台服务器都把docker安装之后,只需要在其中一台服务器中把Tomcat镜像从镜像仓库拉取下来,把这些配置都设置好,做成一个自己的镜像上传到镜像仓库中,之后在其他几台服务器都下载自己做的镜像,运行于docker中,把代码上传,就万事大吉了。 -
保证开发测试等环境完全相同
案例二
前不久的圣诞活动中,公司临时的活动方案在程序员的加班加点中终于上线,但是一上线之后发现推广海报中的中文名字乱码,领导问责测试人员怎么没做好测试,测试很委屈的说我已经测试无数遍并且测试报告都提交了,解决了所有问题才上线的;没办法只能让服务器同事查看正式服务器中的tomcat配置,发现原来 tomcat用了默认编码方式:iso8859-1,而测试环境中是UTF-8。针对这个问题,项目组决定把开发环境迁移到docker中,在测试环境中测试无误后,把镜像打包发布到正式环境中,解决了环境不同导致的问题。
3. Docker组成
- 镜像(Image)
- 容器(Container)
- 仓库(Repository)
4. Docker通俗理解
Docker要理解就只需要两句口号
-
“Build, Ship and Run (搭建、发送、运行)”
例子1:
我来到一片空地,想建个房子,于是我搬石头、砍木头、画图纸,一顿操作,终于把这个房子盖好了。
结果,我住了一段时间,想搬到另一片空地去。这时候,按以往的办法,我只能再次搬石头、砍木头、画图纸、盖房子。
但是,跑来一个老巫婆,教会我一种魔法。
这种魔法,可以把我盖好的房子复制一份,做成“镜像”,放在我的背包里。
等我到了另一片空地,就用这个“镜像”,复制一套房子,摆在那边,拎包入住。 -
“Build once,Run anywhere(搭建一次,到处能用)”。
例子2:
我刚才例子里面,那个放在包里的“镜像”,就是Docker镜像。而我的背包,就是Docker仓库。我在空地上,用魔法造好的房子,就是一个Docker容器。
说白了,这个Docker镜像,是一个特殊的文件系统。它除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(例如环境变量)。镜像不包含任何动态数据,其内容在构建之后也不会被改变。
也就是说,每次变出房子,房子是一样的,但生活用品之类的,都是不管的。谁住谁负责添置。
每一个镜像可以变出一种房子。那么,我可以有多个镜像呀!
也就是说,我盖了一个欧式别墅,生成了镜像。另一个哥们可能盖了一个中国四合院,也生成了镜像。还有哥们,盖了一个非洲茅草屋,也生成了镜像。。。这么一来,我们可以交换镜像,你用我的,我用你的,岂不是很爽?
二.Docker安装
注意:Linux centOS(版本大于等于7.0)
1. 删除旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
2. 安装必备工具
yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加Docker源
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
4. 更新yum缓存
yum makecache fast
5. 安装
yum install docker-ce
6. 创建docker用户
- 创建docker_mananger用户
useradd docker_manager
- 设置密码
passwd docker_manager
docker_manager_wkt
7. 配置docker权限
visudo
visudo
是配置用户权限的文件,在命令行中输入 visudo
回车之后,会进入文件操作,找到 “# %wheel ALL=(ALL) NOPASSWD: ALL”
这一行,把前面的 “#”
去掉,保存文件
8. 授权
usermod -aG wheel,docker docker_manager
9. 启动DockerCE
sudo systemctl enable docker
sudo systemctl start docker
查看是否启动成功
docker info
10. 镜像加速
vim /etc/docker/daemon.json
添加以下内容
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
通知systemd重载此配置文件
systemctl daemon-reload
重启docker服务
systemctl restart docker
三.Docker常用命令
镜像操作
1. 列出本地现有 image
docker image ls
2. 删除 image
docker image rm image_name
3. 下载 image
docker image pull image_name
容器操作
1. 从 image 生成 container 实例
# 新版本
docker container run image_name
# 老版本
docker run image_name
2. 关闭一个容器
# 通过docker强制关闭contaniner
docker container kill container_ID
# 向 container 发送关闭信号,让 container 自己决定如何恰当的关闭
docker container stop container_ID
3. 列出已有的容器
# 列出正在运行的容器
docker container ls
# 列出全部容器
docker container ls --all
4. 运行已经存在的容器
docker container start container_ID
5. 删除容器
docker container rm container_name (或 container_ID)
# 另:在运行 image 产生 container 的时候就加上 --rm 参数,告诉 docker 只要这个 container 一退出,就删除它
docker run -it --rm ...
6. 从容器中拷贝文件到本机
docker container cp container_ID:path_to_file host_path
7. 进入一个正在运行的容器
docker container exec -it container_ID /bin/bash (或者只写 bash)
8. 后台运行容器
docker container run -d image_name
其他
1. 查看现有的网络
docker network ls
现象:
NETWORK ID NAME DRIVER SCOPE
c749b1b83091 bridge bridge local
a23ca96b3291 host host local
74d0c66e9190 none null local
如果在运行
container
时不设定network
,则默认是第一个bridge network
.
此时,如果container
expose
某个port
,例如8080
,则bridge network
中的其他程序可以通过这个port
与它通信。
如果host network
中程序想与它通讯,必须设置一个端口映射-p 5000:8080
,这样所有与host network 5000
端口通讯的都可以被映射到container
的8080
端口。
也可以让container
直接运行在host network
中,这就是为什么在很多运行image
的命令中,都有--net=host
设置。
这样的话,就可以直接通过host
的端口进行通讯了,不需要桥接映射。
2. 文件共享
docker run -v ~/shared_files:/home/docker_user/log_files image_name
# -v /host_path:/container_path 来设置两个系统之间的共享文件夹。
四.创建自定义镜像
1. 用命令更新镜像
- 根据基础镜像,创建容器
docker run --name mytomcat -p 80:8080 -d tomcat
- 修改容器内容
docker exec -it mytomcat /bin/bash
cd webapps/ROOT
rm -f index.jsp
echo hello world > index. html
exit
- 提交为新镜像
docker commit -m="描述消息" -a="作者" 容器ID或容器名 镜像:TAG
# 例:
# docker commit -m="修改了首页" -a="测试" mytomcat zong/tomcat:v1.0
- 使用新镜像运行容器
docker run --name tom -p 8080:8080 -d zong/tomcat:v1.0
2. 用Dockerfile构建镜像
- 创建一个Dockerfile文件
vi Dockerfile
#注意dockerfile指令须大写
FROM tomcat
MAINTAINER zong
RUN rm -f /usr/local/tomcat/webapps/ROOT/index.jsp
RUN echo "<h1>hello world2<h1>" > /usr/local/tomcat/webapps/ROOT/index.html
- 构建新镜像
docker build -f Dockerfile -t zong/tomcat:v2.0 .
# -f Dockerfile路径,默认是当前目录
# -t 指定新镜像的名字以及TAG
五.使用Dockerfile构建Spring应用镜像
1.准备
- 把你的spring boot项目打包成可执行jar包
- 把jar包上传到Linux服务器
2.构建
a.命令构建
- 拉取tomcat文件 :
docker pull 镜像NAME:镜像TAG
docker pull tomcat:8.5
- 挂载文件并启动
docker run -d -p 8098:8080 -v /data/my_tomcat_1/webapps:/usr/local/tomcat/webapps --name my_tomcat_1 tomcat:8.5
- 参数解释
参数 | 含义 |
---|---|
-d | 后台运行 |
-p 8098 : 8080 | 把容器运行的 8080 端口映射到 host 的 8098 端口 |
-v /data/my_tomcat_1/webapps : /usr/local/tomcat/webapps | 用来将容器目录挂载在host主机上,前面的路径是host主机目录 |
–name my_tomcat_1 | 给容器起个名字:my_tomcat_1 |
tomcat:8.5 | tomcat是下载的镜像的NAME。8.5是镜像TAG |
b.文件构建
- 在jar包路径下创建Dockerfile文件
vi Dockerfile
# 指定基础镜像,本地没有会从dockerHub pull下来
FROM java:8
# 可执行jar何复制到基础镜像的根目录下
ADD test.jar /test.jar
# 镜像要暴露旳端口,如要使用端口,在执行docker run命令时使用-p生效
EXPOSE 8080
# 在镜像运行为容器后执行旳命令
ENTRYPOINT ["java", "-jar", "/test.jar"]
- 使用
docker build
命令构建镜像,基本语法
docker build -f Dockerfile -t zong/mypro:v1 .
# -f 指定Dockerfile文件的路径
# -t 指定镜像名字和TAG
# . 指当前目录,这里实际上需要一个上下文路径
- 通过DockerFile部署tomcat
3.运行
运行自己的spring boot镜像
docker run --name pro -p 80:80 -d 镜像名:TAG