0803 - Docker
2021-04-18 10:11:24 32 举报
AI智能生成
Docker是一个开源的应用容器引擎,它允许开发者将应用及其依赖打包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker的主要优点包括:简化程序:Docker让开发者可以打包他们的软件、依赖和配置文件到一个独立的单元中,这个单元可以在几乎任何地方运行。代码流水线管理:Docker可以按照应用程序的生命周期管理应用程序的开发,防止在不同环境中出现不一致的问题。提高开发效率:Docker避免了在安装新软件时“在我的机器上可以运行”的问题。
作者其他创作
大纲/内容
Service Mesh
Kubernetes
Jenkins
整体认知Jenkins体系结构
如何做持续集成
搭建和使用详解
插件体系详解
Docker
定义
Docker是一个开源的应用容器引擎,诞生于2013年初基于GO语言实现,dotCloud公司出品<br><br>Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上<br><br>容器完全使用沙箱机制、互相隔离,容器性能开销极低<br><br>Docker从17.0.3版本之后分为CE(Community Edition 社区版)和EE(Enterprise Edition 企业版) <br>
架构图
Centos下安装Docker
1、Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker <br>通过 uname -r 命令查看你当前的内核版本<br> $ uname -r
2、使用 root 权限登录 Centos。确保 yum 包更新到最新<br>$ sudo yum update
3、卸载旧版本(如果安装过旧版本的话)<br>$ sudo yum remove docker docker-common docker-selinux docker-engine
4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的<br>$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
5、设置yum源<br>$ sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo <br>
6、可以查看所有仓库中所有docker版本,并选择特定版本安装<br>$ yum list docker-ce --showduplicates | sort -r
7、安装docker<br>$ sudo yum install docker-ce #由于repo中默认只开启stable仓库,故这里安装的是最新稳定版17.12.0<br>$ sudo yum install <FQPN> # 例如:sudo yum install docker-ce-17.12.0.ce
8、启动并加入开机启动<br>$ sudo systemctl start docker<br>$ sudo systemctl enable docker
9、验证安装是否成功(有client和service两部分表示docker安装启动都成功了)<br>$ docker version
10、Docker默认安装目录 /var/lib/docker
常用命令
镜像源修改
修改或新增 /etc/docker/daemon.json<br># vi /etc/docker/daemon.json<br>{<br> "registry-mirrors": ["http://hub-mirror.c.163.com"]<br>}<br>执行<br>systemctl restart docker.service
Docker 官方中国区<br>https://registry.docker-cn.com<br>网易<br>http://hub-mirror.c.163.com<br>中国科技大学<br>https://docker.mirrors.ustc.edu.cn
镜像相关命令
查看
$ docker images<br>$ docker images -q #查看所有镜像的ID
搜索
$ docker search 镜像名称
拉取
通过命令可以从镜像仓库中拉取镜像,默认从Docker Hub 获取<br> 命令格式:<br> $ docker image pull microsoft/dotnet:latest
删除
$ docker rmi 镜像ID<br>$ docker rmi ‘docker images -q’ #删除所有镜像
容器相关命令
创建容器
$ docker run -it --name=c1 centos:7 /bin/bash 创建完立即进入容器
-i:保持容器运行,通常与-t同时使用,加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭;<br>-t:为容器重新分配一个伪输入终端,通常与-i同时使用;<br>-d:以守护(后台)模式运行容器,创建一个容器在后台运行,需要使用docker exec进入容器,退出后容器不关闭;<br>-it:创建一个容器一般称为交互式容器;<br>-id:创建一个容器一般称为守护式容器;<br>--name:为创建的容器命名 <br>
#方式一:默认guest 用户,密码也是 guest<br>docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management<br><br>#方式二:设置用户名和密码<br>docker run -d --hostname my-rabbit --name rabbit -e RABBITMQ_DEFAULT_USER=rabbit -e RABBITMQ_DEFAULT_PASS=rabbit -p 15672:15672 -p 5672:5672 rabbitmq:management<br>
查看容器
$ docker ps #查看正在运行的容器<br>$ docker ps -a #查看所有容器
进入容器
$ docker exec 参数 #退出容器,容器不会关闭
停止容器
$ docker stop 容器名称
启动容器
$ docker start 容器名称
删除容器
$ docker rm 容器名称 #如果容器是运行状态则删除失败,需要停止容器才能删除
查看容器信息
$ docker inspect 容器名称
容器的数据卷
概念
数据卷是宿主机中的一个目录或文件;当容器目录和数据卷目录绑定后,对方的修改会立即哦同步;一个容器可以挂载多个数据卷
配置数据卷
$ docker run ... -v 宿主目录(文件):容器内目录(文件)...
注意:1、目录必须是绝对路径;2、如果目录不存在,会自动创建;3、可以挂载多个数据卷
举例
$ docker run -it --name=c3 -v ~/data:/root/data centos:7
数据卷容器
多个容器进行数据交换,两个方法:(1)多个容器挂载同一个数据卷;(2)数据卷容器
配置数据卷容器案例
1、创建启动C3数据卷容器,使用-v参数设置数据卷<br>$ docker run -it --name=c3 -v /volume centos:7 /bin/bash<br><br>2、创建启动c1、c2容器,使用--volumes-from参数设置数据卷<br>$ docker run -it --name=c1 -volumes-from c3 centos7 /bin/bash<br>$ docker run -it --name=c12 -volumes-from c3 centos7/bin/bash
作用
容器数据的持久化;客户端和容器数据交换;容器间数据卷交换
Docker应用部署
实现步骤:(1)搜索镜像;(2)拉取镜像;(3)创建容器;(4)操作
部署MySQL
1、搜索MySQL镜像<br>$ docker search mysql<br>--------------------------------------------------------------<br>2、拉取MySQL镜像<br>$ docker pull mysql:5.6<br>--------------------------------------------------------------<br>3、创建容器、设置端口映射、目录映射<br>$ docker run -id --name=gulimall_mysql -p 3306:3306 \<br>-v /mydata/mysql/log:/var/log/mysql \ <br>-v /mydata/mysql/data:/var/lib/mysql \<br>-v /mydata/mysql/conf:/etc/mysql \<br>-e MYSQL_ROOT_PASSWORD=root \<br>-d mysql:5.7<br>-------------------------------------------------------------<br>4、进入容器,操作MySQL<br>$ docker exec -it c_mysql /bin/bash<br>5、在/mydata/mysql/conf目录下运行命令 vi my.cnf<br>输入如下配置信息:<br>############################################<br>[client]<br>default-character-set=utf8<br><br>[mysql]<br>default-character-set=utf8<br><br>[mysqld]<br>init_connect='SET collation_connection = utf_unicode_ci'<br>init_connect='SET NAMES utf8'<br>character-set-server=utf8<br>collation-server=utf8_unicode_ci<br>skip-character-set-client-handshake<br>skip-name-resolve <br>###########################################<br>6、重启MySQL容器<br>$ docker restart gulimall_mysql<br>7、进入MySQL容器<br>$ docker exec -it gulimall_mysql /bin/bash
参数说明:<br><br>---------------------------------------<br><br>-p 3307:3306 将容器的3306端口映射到宿主机的3307端口<br><br>-v $PWD/conf:/etc/mysql/conf.d 将主机当前目录下的conf/my.cnf挂载到容器的/etc/mysql/my.cnf配置目录<br><br>-v $PWD/logs:/logs 将主机当前目录下的logs目录挂载到容器的/logs日志目录<br><br>-v $PWD/data:/var/lib/mysql 将主机当前目录下的data目录挂载到容器的/var/lib/mysql数据目录<br><br>-e MYSQL_ROOT_PASSWORD=12345 初始化root用户的密码
部署tomcat
1、搜索tomcat镜像<br>$ docker search tomcat<br>-----------------------------------<br>2、拉取tomcat镜像<br>$ docker pull tomcat<br>-----------------------------------<br>3、创建容器,设置端口映射、目录映射<br>#在/root目录下创建tomcat目录用于存储tomcat数据信息<br>$ mkdir ~/tomcat<br>$ cd ~/tomcat<br>$ docker run -id --name=c_tomcat -p 8080:8080 -v $PWD:/usr/local/tomcat/webapps tomcat
部署Nginx
1、搜索Nginx镜像<br>$ docker search nginx<br>-----------------------------------<br>2、拉取Nginx镜像<br>$ docker pull nginx<br>-----------------------------------<br>3、创建容器,设置端口映射、目录映射<br>#在/root目录下创建tomcat目录用于存储tomcat数据信息<br>$ mkdir ~/nginx<br>$ cd ~/nginx<br>$ mkdir conf<br>#在~/nginx/conf下创建nginx.conf文件,粘贴下面内容<br>$ vim nginx.conf<br>##########################################<br>usr nginx;<br>worker_processes 1;<br>error_log /var/log/nginx/error.log warn;<br>pid /var/run/nginx.pid;<br>events{<br> worker_connections 1024;<br>}<br>http{<br> include /etc/nginx/mime.types;<br> default_type application/octet-stream;<br> log_format main '$remote_addr - $remote_user [$time_local] "$request"'<br> '$status $body_bytes_sent "$http_referer"'<br> '"$http_user_agent" "$http_x_forwarded_for"';<br> access_log /var/log/nginx/access.log main;<br> sendfile on;<br> #tcp_nopush on;<br> include /etc/nginx/conf.d/*.conf; <br>}<br>##########################################<br>$ docker run -id --name=c_nginx -p 80:80 \<br>-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \<br>-v $PWD/logs:/var/log/nginx \<br>-v $PWD/html:/var/share/nginx/html \<br>nginx
部署Redis
1、搜索redis镜像<br>$ docker search redis<br>-----------------------------------<br>2、拉取redis镜像<br>$ docker pull redis:5.0<br>-----------------------------------<br>3、创建容器,设置端口映射、目录映射<br>$ docker run -id --name=c_redis -p 6379:6379 \<br>-v /mydata/redis/data:/data \<br>-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \<br>-d redis redis-server /etc/redis/redis.conf \<br>-d redis:5.0<br>--------------------------------------------------<br>4、使用外机连接redis<br>$ ./redis-cli.exe -h 192.168.149.135 -p 6379
部署ElasticSearch
1、搜索ElasticSearch镜像<br>$ docker search ElasticSearch<br>2、拉取ELasticSearch镜像<br>$ docker pull elasticsearch:7.4.2<br><br>$ chmod -R 777 /mydata/elasticsearch/ <br><br>$ docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \<br>-e "discovery.type=single-node" \<br>-e ES_JAVA_OPTS="-Xms64m -Xmx128m" \ <br>-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \<br>-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \<br>-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \ <br>-d elasticsearch:7.4.2<br>
部署Kibana
1、搜索Kibana镜像<br>$ docker search Kibana<br>2、拉取Kibana镜像<br>$ docker pull kibana:7.4.2<br>$ mkdir -p /mydata/kibana/config<br>3、kibana.yml文件内容,而elasticsearch.url表示elasticsearch的访问路径<br>$ mkdir -p /mydata/kibana/config<br>*****************************************************************************<br># Default Kibana configuration for docker target<br>server.name: kibana<br>server.host: "0"<br>elasticsearch.hosts: [ "http://192.168.12.183:9200" ]<br>xpack.monitoring.ui.container.elasticsearch.enabled: true<br>******************************************************************************<br>4、运行容器<br>docker run -d --restart=always --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kibana -p 5601:5601 -v /mydata/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml kibana:7.4.2<br>
Dockerfile
描述
Dockerfile是一个文本文件,包含了一条条的指令,每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像<br>对于开发人员,可以为开发团队提供一个完全一致的开发环境<br>对于测试人员,可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了<br>对于运维人员,在部署的时候可以实现应用的无缝移植
Docker镜像原理
操作系统组成部分
进度调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
bootfs:包含bootloader(引导加载程序)和kernel(内核)
root方式:root文件系统,包含的就是典型Linux系统中的/dev、/proc、/bin、/etc等标准目录和文件
不同的Linux发行版,bootfs基本一样,而rootfs不同,如ubuntu、centos等
网络通信子系统
作用控制子系统
Docker镜像是由特殊的文件系统叠加而成;最低端是bootfs,并使用宿主机的bootfs<br><br>第二层是root文件系统rootfs称为base image;然后再往上可以叠加其它的镜像文件<br><br>统一文件系统(Union File System)技术能够将不同层整合成一个文件系统,为这层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统<br><br>一个镜像可以放在另一个镜像的上面,位于下面的镜像称为父镜像,最底部的镜像称为基础镜像<br><br>当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
Dockerfile制作案例
(1)定义父镜像:FROM centos:7<br>(2)定义作者信息:MAINTAINER itheima<itheima@163.com><br>(3)执行安装vim命令:RUN yum install -y vim<br>(4)定义默认的工作目录:WORKDIR/usr<br>(5)定义容器启动执行的命令:CMD /bin/bash
docker build -f ./centos_dockerfile -t xzln_centos:1
服务编排(按照一定的业务规则批量管理容器)
微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启动维护的工作量很大<br>要从Dockerfile bulid image或者去dockerhub拉取image<br>要创建多个container<br>要管理这些container(启动停止删除)
Dockers Compose
是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建、启动和停止
Docker私有仓库
Docker官方的Dockerhub是一个用于管理公共镜像的仓库,我们可以从上面拉取镜像到本地,也可以把我们自己的镜像推送上去。但是,有时候我们的服务器无法访问互联网,或者你不希望自己的镜像放到公网中,那么我们就需要搭建自己的私有仓库来存储和管理自己的镜像。
0 条评论
下一页