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.    验证登录

[email protected] -p 55555

这里的55555 是docker容器的映射的22

注修改ssh密码echo 'root:passwd' | chpasswd

重启即可  systemctl restart sshd.service/service sshdrestart

安装环境工具jdk,nginx,mysql

方式一:在线安装yum…

方式二:本地stfp工具拷贝

方式三:从宿主机拷贝这里

既然学习docker这里就介绍第三种:

准备文件,这里准备数据

1.    把文件远程拷贝到宿主机

scp [email protected]:/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定位该容器的对应数据

你可能感兴趣的:(Docker 简介与部署)