Docker学习笔记(附带常见应用部署)一篇就够

Docker简单了解

原来我们在Linux上总会配置一大堆的环境,如果要启动多个,启动所要消耗的时间也很长,而且应用在服务器上的迁移麻烦,开发测试上线环境的不同也会导致一些未知的问题,为了解决这些个问题,因而诞生了Docker引擎。只需在物理机/虚拟机上安装Docker,通过别人打包好传过来的Docker镜像,可以立刻运行。

一、安装准备

1、首先说明我用的是CentOS7。如果是Ubuntu或者别的,下边的操作会有所不同。
2、保证成功联网。

二、Docker的安装

1、查看CentOS内核版本

uname -r	# 这里需要内核版本不低于3.10
yum update	# 如果低于3.10才使用该指令

2、在线安装docker

yum install docker	# 一路按y

3、开启docker

systemctl start docker

4、查看docker版本

docker --version	#如果出现版本信息,则说明安转成功

5、docker自启动

systemctl enable docker 	#以后一开虚拟机就会启动该服务 ,不用每次都start

6、停止docker

systemctl stop docker

三、获取镜像

1、搜索要导入的镜像软件

docker search 软件名		#例如tomcat、mysql

2、拉取镜像文件到本地

docker pull 软件名:版本号		# 例如tomcat:latest

这里提一下,如果不配置阿里云镜像加速,可能会拉不动

阿里云镜像加速配置方法:
前往 www.aliyun.com → 注册登录,前往控制台 → 产品与服务 → 容器镜像服务 → 镜像加速器
按照阿里云官方操作文档进行操作即可。
镜像配置:

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://c68mgirk.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

3、docker所有本地镜像查看

docker images

4、docker删除镜像

docker rmi 镜像id/镜像名

四、Docker容器启动

1、docker第一次启动容器

docker run --name 自取容器名 -d -p 主机端口:容器内部端口 镜像软件名:版本号	--restart always
# 	例如 docker run --name mytomcat -d -p 8081:8080 tomcat:latest
#	--name docker容器名 (自己取名)
#	-d 后台运行
#	-p 指定端口映射	例子中的意思是从主机端口映射到docker容器的端口,因为应用运行于容器中,要实现容器端口和主机端口的对接
# 	--restart always 启动docker即启动容器服务

** 这里注意安装不同的应用,需要指定的参数不尽相同,详见docker hub**

2、docker查看所有容器

docker ps -a

查看正在运行的容器

docker ps

3、docker停止运行中的容器

docker stop 容器id/容器名

4、docker启动已有的容器

docker start 容器id/容器名

5、docker删除容器

docker rm 容器id/容器名

6、docker容器的日志显示

docker logs 容器id

7、docker指定容器进入交互模式

docker exec -it 容器id /bin/bash		

8、docker 挂载(实现本地文件和容器内部文件的数据共享方式其一,详见第六章)

docker run 添加-v 本地目录文件:容器内部目录配置文件 ...

9、docker 容器内外部文件互相拷贝

docker cp 本地文件 容器id:容器内部文件(记得docker restart 容器id/容器名,否则不生效)
docker cp 容器id:容器内部文件 本地文件

10、docker 查看镜像/容器的信息

docker inspect 镜像id/容器id

五、Docker安装常见应用(单机安装采坑)

1、安装elasticsearch

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -e "discovery.type=single-node" -d -p 9200:9200 -p 9300:9300 --name 容器名 镜像id
# 指定占用内存大小为256m,服务启动需要等待一定时间 

跨域设置(防止数据交互被阻止)

# 进入交互模式
# 修改config下的elasticsearch.yml
vi config/elasticsearch.yml
# 添加如下代码
http.cors.enabled: true
http.cors.allow-origin: "*"

2、安装nginx

docker run -d -p 80:80 --name 容器名 镜像id

** 配置文件修改**

方法一

# 进入交互模式,进入 /etc/nginx 
# 发现vim/vi指令失效,解决办法:
apt-get update
apt-get install vim

方法二

docker run 添加-v 本地目录文件:容器内部目录配置文件 ...

注意!

添加反向代理后需要开启本地防火墙端口(例如tomcat的8080端口),原来docker自己做端口映射是不需要自己手动开启防火墙端口的,这里需要自己手动开启。补充一下端口开放

# 查看防火墙信息
firewall-cmd --list-all
# 添加
firewall-cmd --zone=public --add-port=8080/tcp --permanent (permanent代表永久生效,没有此参数重启后失效)
# 重新载入
firewall-cmd --reload
#删除
firewall-cmd --zone= public --remove-port=8080/tcp --permanent

3、安装redis

考虑到小伙伴们要使用客户端工具连接到远端redis,如果直接拉取redis安装的话远端无法直接访问,再加上为了安全起见,访问redis最好加上密码,下面会基于这一点进行配置:

首先从 http://download.redis.io/redis-stable/redis.conf 把 redis.conf 配置文件拿下来,对里面的参数进行修改

1、把里面的 bind 127.0.0.1给注解掉
2、把protected-mode yes 设置为protected-mode no

注意: 如果开启守护线程的话运行容器会秒退

docker run -p 6379:6379 --name redis01 -v /usr/local/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/redis/data:/data -d 镜像id redis-server /etc/redis/redis.conf --appendonly yes
# 这里/usr/local/redis/redis.conf是我自己存放配置文件的地方,把修改好的配置放粘进去就好,/usr/local/redis/data的话自己建个文件夹放数据

4、安装rabbitmq

参考地址:https://www.cnblogs.com/angelyan/p/11218260.html

#指定版本,该版本包含了web控制页面,否则无法通过ip:15672访问到web视图界面
docker pull rabbitmq:management
#方式一:默认guest 用户,密码也是 guest
docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management

#方式二:设置用户名和密码
docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:management

六、Docker数据共享

相信到这里小伙伴已经对docker已经有了初步的认知,但是正如我们所知道的,如果在虚拟机或者物理机上直接安装某个应用,修改配置文件非常的方便,可是docker下我们怎么修改容器内部的配置文件呢(当然比较笨的办法是通过docker cp用本地方法覆盖容器内部方法)。容器与宿主机之间的数据如何达到共享,亦或者是容器与容器之间的如何达到数据共享,下面介绍常用的办法。(可以查看官方对于容器数据卷概念的解释)

1、容器与宿主机数据共享

①、在docker运行容器的时候挂载本地的文件/目录

通过-v 的方式实现本地文件和容器内部文件的数据共享,无论是修改容器内外哪一方的文件内容,另一方都会生效,数据共享生效。

docker run -v 本地文件:容器内部文件 ... 镜像id

当然也可以设置权限,设置为容器内只读(read-only)

docker run -v 本地文件:容器内部文件:ro ... 镜像id

②、使用dockerFile

编写dockerFile脚本,通过构建dockerFile来实现目录的挂载,挂载后宿主机文件的位置可以通过docker inspect 在数据卷位置(Volumn)查看详细的路径,dockerFile详细将在第七章展开。

2、容器与容器数据共享

通过–volumns-from 的方式达成容器间数据的共享

docker run ... --volumn-from 容器id(基于哪一个容器) 镜像id 

相当于说基于一个镜像模板创建多个容器实例,而容器实例间实现了一种连线式的传递过程。那么考虑一个问题,如果创建多个容器相互之间,其中一个容器被销毁了,那么它是基于别的容器也好,还是被别的容器基于,在同一个镜像下所创建的一系列容器的数据共享是否会发生断开? 不会! 只要通过数据卷依赖方式,有使用这个镜像的容器存在,数据就能保证实时共享。

七、DockerFile

首先,dockerfile本身是一个文本文件,它的目的是用来创建镜像的。
通过下面这张图,我们能够很快的知道dockerfile的构建过程:dockerfile通过build命令来构建镜像,而build内部发生了如下操作:

1、运行镜像生成容器

2、执行一条dockerfile指令

3、打包容器变为镜像

重复以上操作直到所有的指令执行完毕。
在这里插入图片描述
dockerfile指令具体可以参考官方文档,或者以下参考博客,写的还是非常不错的:

https://www.cnblogs.com/edisonchou/p/dockerfile_inside_introduction.html

这里直接举个例子,基于dockerfile完成对springboot的jar包部署:

1、springboot的jar包部署

①、拉取java8镜像
# 拉取java8,我们以java -jar方式运行
docker pull java:8
②、编写dockerfile
# 基于java8构建镜像
FROM java:8
# 作者
MAINTAINER Jc2hen
# 添加jar包,并且改名,前后者分别是改名前后的路径
ADD jar/test.jar /usr/local/docker_test/mytest.jar
# 运行jar包,nohup后台运行,java -jar xxx.jar
ENTRYPOINT ["nohup","java","-jar","/usr/local/docker_test/mytest.jar"]
③、构建镜像

-t 构建后的镜像名
-f dockerfile路径,指定到文件
最后这个 . 表示当前目录,即上下文环境,如果不在当前目录下,需要把 . 替换指定,比如 /usr/local/docker_test

# 注意:最后那个点不要忘了
docker build -t myslot -f /usr/local/docker_test/dockerfile/ .
④、运行镜像
docker run -d -p 8080:8080 --name boot_slot 镜像id

至此,springboot的应用部署完毕,war包默认还会带项目名(当然可以通过删除ROOT去掉),运行jar不会给额外带上项目名。

这里的 VOLUME 指令用的也非常多,可以指定共享数据卷,有点类似于 -v 操作,可以实现宿主机与容器内部数据的共享,当然指定容器目录,不指定宿主机目录的情况下,宿主及目录docker也会自动帮你创建,可以通过inspect命令查看,有兴趣的可以自己去探索。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值