Docker 简介与部署

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定位该容器的对应数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容