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