Docker基本概念
l. 镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。
2. 容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
3. 仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。
Docker的场景和优点
场景:
1. Web 应用的自动化打包和发布。
2. 自动化测试和持续集成、发布。
3. 在服务型环境中部署和调整数据库或其他的后台应用。
4. 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境
优点:
1. 快速,一致地交付您的应用程序
2. 响应式部署和扩展
3. 在同一硬件上运行更多工作负载
总的来说: Docker是一个用于开发,交付和运行应用程序的开放平台。Docker 使您能够将应用程序与基础架构分开,从而可以快速交付软件。借助 Docker,您可以与管理应用程序相同的方式来管理基础架构。通过利用 Docker 的方法来快速交付,测试和部署代码,您可以大大减少编写代码和在生产环境中运行代码之间的延迟。
Docker安装与常用命令
1. 在线安装:
(若网络获取不到插件库这里列表centos8更换源,见末尾细节总结)
2. 容器使用
docker ps 查看启用的容器(docker container ls)
docker ps –a 查看所有容器
docker exec –it [容器id] /bin/bash进入容器,exit不会停止容器
docker start/stop/restart 容器id 操作容器
docker export [容器id] > ubuntu.tar 导出容器
cat ubuntu.tar | docker import -test/ubuntu:v1 导入容器
docker rm –f [容器id]删除容器
docker stop $(docker ps -q) 停用全部运行中的容器
docker rm $(docker ps -aq) 删除全部容器
docker run –t –id java:new /bin/bash 后台创建启动java:new镜像(精简版)
docker run -itd -p 55556:22 -p 9001:80 -p 33306:3306 -v /home/dock/Downloads:/usr/Downloads--name=web1 --privileged=true java_web /sbin/init
这里安装顺序映射了三个端口ssh,nginx,mysql
privileged=true /sbin/init:使你在容器拥有root权限,如可以systemctl service等
-v挂载:指定宿主机和docker容器的目前(--volumes-from也是挂载方式)
3. 镜像使用
docker search xx 搜索镜像
docker pull xx 拉去镜像
docker images 镜像列表
docker rmi [镜像名称] 删除镜像
4. 镜像制作与更新
1.创建一个新的镜像
1. 准备一个Dockerfile文件,命名一致
2. 写入命令,如:
FROM centos7 //拉取镜像
MAINTRAINER xx //指定作者
RUN yum intasll –y nginx //第一步安装nginx
EXPOSE 80 //第一步开放80端口
…
3. 当前Dockerfile目录 执行 docker build -t name:v1.0
2. 更新成一个新的镜像
docker commit-m="jdk8_nginx_mysql5_ssh" -a="zhuhai" edce7b3d8789java_web
-m:描述–a:作者 java_web:镜像名edce7b3d8789:当前容器id
安装ssh服务
1. yum install openssh-server
2.配置密码
mkdir /var/run/sshd
echo 'root:zhuhai123' | chpasswd
# 这里使用你自己想设置的用户名和密码,但是一定要记住!
sed -i 's/PermitRootLogin prohibit-password/PermitRootLoginyes/' /etc/ssh/sshd_config
sed 's@session\s*required\s*pam_loginuid.so@sessionoptional pam_loginuid.so@g' -i /etc/pam.d/sshd
echo "export VISIBLE=now" >> /etc/profile
3.修改配置文件
将PermitRootLogin改为yes
去掉PasswordAuthentication
yes前的#
再重启ssh
systemctlrestart sshd.service/service sshd restart
4. 验证登录
sshroot@10.197.237.197 -p 55555
这里的55555 是docker容器的映射的22
注修改ssh密码echo 'root:passwd' | chpasswd
重启即可 systemctl restart sshd.service/service sshdrestart
安装环境工具jdk,nginx,mysql
方式一:在线安装yum…
方式二:本地stfp工具拷贝
方式三:从宿主机拷贝这里
既然学习docker这里就介绍第三种:
准备文件,这里准备数据
1. 把文件远程拷贝到宿主机
scp jdk-8u231-linux-x64.tar.gzroot@10.197.237.197:/opt
2. 把宿主机数据拷贝到docker容器
docker cp jdk-8u231-linux-x64.tar.gz edce7b3d8789:/opt/
docker cp -a ../temp edce7b3d8789:/opt/ai-authorize/temp(文件夹递归复制)
edce7b3d8789这里是容器的id
3. 解压安装跳过
4. 安装完成这里把更新后的容器打成镜像,方便部署环境的移植
docker commit -m="jdk8_nginx_mysql5_ssh"-a="zhuhai" edce7b3d8789 java_web
-m:描述–a:作者java_web:镜像名edce7b3d8789:当前容器id
5. 使用新镜像创建容器
docker run -itd -p55556:22 -p 9001:80 -p 33306:3306 --name=web1 --privileged=true java_web/sbin/init
这里安装顺序映射了三个端口ssh,nginx,mysql
privileged=true /sbin/init:使你在容器拥有root权限,如可以systemctl service等
学习网站(https://www.runoob.com/docker/docker-tutorial.html)
问题总结:
1. centos8更换源
cd /etc/yum.repos.d/
mkdir bak
mv * bak
curl -o /etc/yum.repos.d/CentOS-Base.repohttp://mirrors.aliyun.com/repo/Centos-7.repo
yum makecache
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
2. 网络问题
Docker容器的网络模式有四种:
Bridge 桥接模式(默认,不需要指定):推荐使用
Host 网络模式(使用后,不能再指定端口)
Container 网络模式
None 网络模式
这里在学习时遇到一个问题,初期使用了centos7的系统,docker安装后,docker容器ping网桥和宿主机ping网桥都能通信,但是docker和宿主机不通信,后来查询使用一些自定义网桥等等..措施还是无济于事,后来尝试更新了系统,就解决了,查询问题在于原centos7系统安装的内核版本过低无法和docker的网络机制兼容,所以建议使用centos7系统,最好使用高内核版本.
3. 服务器实际时间和java服务时间相差8小时:
排查问题:
[if !supportLists]1. [endif]服务器问题:date –R 若东八区则没问题
[if !supportLists]2. [endif]Mysql服务器时区:开发本地测试过没问题select Now();
[if !supportLists]3. [endif]Jdk时区:项目中log输出时区,如TimeZone.getDefault(),这里是UTC,国际标准时区,问题所在
修改:项目启动设置时区,这里介绍springboot项目
这里我的jar包测试过只有第三种实际生效
1、在启动类
@PostConstruct
void setDefaultTimezone() {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
}
2、在application.properties加上
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=Asia/Shanghai
3、在启动类 启动run方法里加上
public static void main(String[] args) {
TimeZone.setDefault(TimeZone.getTimeZone("Asia/Shanghai"));
SpringApplication.run(BaseMicroServiceApplication.class, args);
}
4. nignx代理配置问题
listen 80; //页面输入的端口映射为服务的80端口
server_name localhost;
location / { //页面不输入请求实际地址,代理指向首页
root html;
index index.html index.htm;
}
location /api {
proxy_pass http://127.0.0.1:33330/api/;
}
//这里配置/api,区分时代理到前端页面还是后端请求,所以这里加上前缀,ngnix检查到/api会代理去请求配置的容器内服务的33330端口的实际后台请求,这里服务也许要配置前缀。
5. 挂载数据库数据
这里考虑,一台宿主机可能运行多个docker容器,如果数据库数据存储在容器中,崩溃则会出险数据丢失等风险问题,所以这里使用挂载把容器中的数据挂载一份到宿主机中,这样就算容器崩溃了,新建容器也可以恢复数据,下面简单命令:
docker run –v /opt/bak/web_app/mysql/data:/opt/mysql/data…
冒号:前是宿主机目录,后是容器目录,不存在容器run后会自动创建路径,注意使用绝对路径
web_app:是启动是--name指定的创建者,这里便于崩溃了后根据name定位该容器的对应数据