Docker

一、介绍
Docker维护着一个巨大的镜像资源库(Docker Hub),Docker是一个允许你创建镜像,且让这个镜像的实例运行在容器中的软件
1.作用
1)用于开发、交付和运行应用的开放平台,Docker被设计用于更快地交付应用
2)将应用程序和基础设施层隔离,并且可以将基础设施当作程序一样进行管理
3)以更快地打包代码、测试以及部署,并且可以减少从编写到部署运行代码的周期
2.特性:
1)内核容器特性(LXC)、工作流和工具集成,以帮助管理和部署应用
2)核心:在安全隔离的容器中运行近乎所有应用的方式,允许你在同一个主机上同时运行多个容器,而无需消耗运行hpervisor所需的额外负载,可以节省更多的硬件资源
3.Docker 容器管理工具
1)容器管理"工具":一个轻量级、便携式、与外界隔离的容器
2)引擎:可在容器中很方便地构建、传输、运行应用的引擎
注:不是虚拟化引擎,是直接使用宿主机的内核和硬件
2.1)性能差距:Docker 容器内运行的应用和宿主机上运行的应用性能差距几乎可以忽略不计
2.2)使用 namespace 和 CGroup 进行资源限制,和宿主机共享内核
注:Docker 是在宿主机中运行了一个受到限制的应用程序
3)提供了更加友好的镜像管理工具和部署工具。
4.虚拟化引擎
1)缺点:
a.传统
b.所有虚拟出的这些都会带来相当多的性能损失
c.一台主机上跑太多的虚拟机之后就会过载
2)优点:
a.宿主机是 Linux,只能通过虚拟机运行 Windows,Docker 便无法做到。
b.宿主机是 Windows,Windows 并不能直接运行 Docker,Windows上的 Docker 其实是运行在 VirtualBox 虚拟机里的

5.Docker 层级的文件系统
1)镜像是一个静态的、只读的容器文件系统的快照
2)版本拷贝进镜像从而创建一个新镜像,然后给新镜像贴上版本的标签,一个 90 MB 大小的 WAR 文件,所基于的主镜像都是相同的,
注:虚拟机去维护这些不同的版本的话,还要消耗掉很多不同的磁盘去存储相同的系统
3)同时运行这个镜像的很多实例,我们也只需要一个基础的 JAVA / TOMCAT 镜像

6.节约时间:
1)可以搭建整个环境,还可以将整个环境保存成磁盘文件,然后复制到别的地方
2)只需要运行 docker-compose up 命令即可
7.节省开销
1)节省在基础设施硬件上的开销:在实例之间进行内存和磁盘共享
2)在同一台主机上运行多个服务、可以不用去限制容器所消耗的资源、可以去限制资源、可以在不需要的时候停止容器,不用担心启动已经停止的程序时会带来过多的资源消耗
注:CGroup,可以很方便动态调整资源限制,让然也可以不进行资源限制


二、安装
1.按照docker官网,下载相应系统的docker
如:mac,和安装软件一样
2.配私有docker镜像加速器:都用官网统一的比较慢
如:docker 阿里镜像加速器
1)点击 https://cr.console.aliyun.com/#/accelerator 注册一个账号,即会有一个私有镜像加速器。
您的专属加速器地址: https://1i9rj8as.mirror.aliyuncs.com
2)配置私有镜像加速器:
a.启动docker
b.找到Preferences-->Daemon
c.Insecure registries里配阿里官方加速器:
registry.mirrors.aliyuncs.com
d.Registry mirrors里配自己私有的官方加速器:
https://1i9rj8as.mirror.aliyuncs.com

三、实例构建Docker镜像
1.maven打包和启动
1)maven package打包:
如:demo-discovery-eureka 打包后为:target/demo-discovery-eureka-1.0-SNAPSHOT.jar
/Users/XHZ/Project/BQ/xms/server-discovery/target/demo-discovery-eureka-1.0-SNAPSHOT.jar
2)java -jar即可 启动项目:
java -jar /Users/XHZ/Project/BQ/xms/server-discovery/target/server-discovery-1.0.jar --server.port=8761 --spring.profiles.active=server-discovery1
java -jar /Users/XHZ/Project/BQ/xms/server-discovery/target/server-discovery-1.0.jar --server.port=8762 --spring.profiles.active=server-discovery2
java -jar /Users/XHZ/Project/BQ/xms/server-discovery/target/server-discovery-1.0.jar --server.port=8763 --spring.profiles.active=server-discovery3
java -jar /Users/XHZ/Project/BQ/xms/config-server/target/config-server-1.0.jar
java -jar /Users/XHZ/Project/BQ/xms/provider-user/target/provider-user-1.0.jar --server.port=8000
java -jar /Users/XHZ/Project/BQ/xms/provider-user/target/provider-user-1.0.jar --server.port=8001
java -jar /Users/XHZ/Project/BQ/xms/provider-user/target/provider-contract-1.0.jar
java -jar /Users/XHZ/Project/BQ/xms/provider-user/target/consumer-beehive-1.0.jar
java -jar /Users/XHZ/Project/BQ/xms/provider-user/target/consumer-template-1.0.jar

2.Docker镜像 构建和启动:即构建和启动项目
maven(hello.war)-->build(hello image)-->push(docker registry)-->run(hello 容器)
1)方式一:不用Dockerfile,通过标签来定义镜像构建过程
a.修改pom.xml文件,添加镜像信息
<!-- 使用插件部署 -->
<properties>
<project.docker>${project.basedir}/src/main/docker</project.docker>
<project.image.name>${project.artifactId}</project.image.name>
</properties>
<build>
<plugins>
<plugin>
<!-- maven插件-->
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>1.0.0</version>
<configuration>
<imageName>${project.image.name}</imageName>
<!-- 方式一:不使用Dockerfile -->
<baseImage>java</baseImage>
<entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]</entryPoint>
<!-- 镜像版本号:建议特定的标记 镜像 -->
<imageTags>
<imageTag>${project.version}</imageTag>
</imageTags>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
</plugins>
</build>
2)方式二:用Dockerfile
a.修改pom.xml文件,添加镜像信息
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>registry.test.com/example</imageName>
<!-- 查找Dockerfile所在文件目录 -->
<dockerDirectory>${project.basedir}/</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
b.创建Dockerfile文件,内容如下:
From registry.test.com/base_image:centos6.6

ADD target/test-classes /data1/target/test-classes
ADD target/dockermaven/lib /data1/target/dockermaven/lib
ADD start.sh /data1/
ADD lib/jdk-1.8.0_77-2.el6.x86_64.rpm /jdk-1.8.0_77-2.el6.x86_64.rpm
RUN rpm -ivh /jdk-1.8.0_77-2.el6.x86_64.rpm
ENV JAVA_HOME /usr/local/jdk1.8.0_77
ENV PATH $PATH:$JAVA_HOME/bin
RUN chmod +x /data1/start.sh
WORKDIR /data1
CMD sh start.sh
3)构建:
mvn clean package docker:build
4)启动:
a.创建网段:因docker不指定网段,会自动分配网络ip,此ip可能是ping不通的。
docker network create --subnet=10.83.3.0/16 xms
注:10.83.3.0/16指0到16的网段,xms是自定义的网段名
a1. docker network create:创建网段
a2.docker network connect:连接
a3.docker network ls:查看
a4.docker network rm:删除
a5.docker network disconnect:关闭连接
a6.docker network inspect:查看某网段详情
b.启动项目:
启动rabbitMq:
docker run -d -p 5672:5672 -p 15672:15672 --net xms --ip 10.83.3.0 rabbitmq:management
启动mysql:
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root --net xms --ip 10.83.3.16 mysql:5.6.35
启动eureka:
docker run -p 8761:8761 --net xms --ip 10.83.3.1 server-discovery --server.port=8761 --spring.profiles.active=10.83.3.1
docker run -p 8762:8762 --net xms --ip 10.83.3.2 server-discovery --server.port=8762 --spring.profiles.active=10.83.3.2
docker run -p 8763:8763 --net xms --ip 10.83.3.3 server-discovery --server.port=8763 --spring.profiles.active=10.83.3.3
other 启动:
docker run -p 8040:8040 --net xms --ip 10.83.3.4 config-server
docker run -p 8001:8001 --net xms --ip 10.83.3.5 provider-user:1.0 --server.port=8001
docker run -p 8002:8002 --net xms --ip 10.83.3.6 provider-user:1.0 --server.port=8002 --spring.cloud.config.profile=prd
docker run -p 8010:8010 --net xms --ip 10.83.3.7 provider-contract
docker run -p 8020:8020 --net xms --ip 10.83.3.8 consumer-beehive --server.port=8020
docker run -p 8021:8021 --net xms --ip 10.83.3.9 consumer-beehive --server.port=8021
docker run -p 8030:8030 --net xms --ip 10.83.3.10 consumer-template
docker run -p 8080:8080 --net xms --ip 10.83.3.11 route-gateway
docker run -p 8050:8050 --net xms --ip 10.83.3.12 server-monitor
docker run -d -p 9100:9100 -p 9200:9200 -p 9300:9300 --net xms --ip 10.83.3.13 elasticsearch:latest

4.将Docker镜像push到DockerHub上
1)修改Maven的全局配置文件settings.xml
<servers>
<server>
<id>docker-discovery-eureka</id>
<username>你的DockerHub用户名</username>
<password>你的DockerHub密码</password>
<configuration>
<email>你的DockerHub邮箱</email>
</configuration>
</server>
</servers>
2)在DockerHub上创建repo,例如:test
a.pom.xml里的 imageName的路径要和repo的路径一致
<imageName>eacdy/test</imageName>
b.pom.xml的</resources>后面添加:serverId与maven的settings.xml的server的<id>名一致
<!-- 以下两行是为了docker push到DockerHub使用的。 -->
<serverId>docker-discovery-eureka</serverId>
<registryUrl>https://index.docker.io/v1/</registryUrl>
3)push:
mvn clean package docker:build -DpushImage

注:从私服上下载该镜像:reg.itmuch.com 为私服地址
a.docker login reg.itmuch.com # 然后输入账号和密码
b.docker pull reg.itmuch.com/test-pull-registry

5.问题
1)docker-maven-plugin版本问题,一般会提交当前版本,更新到0.4.13即可
2)远程加速器配置
3)docker远程访问 配置
如:docker在centos7系统
1.编辑docker
vim /etc/sysconfig/docker
加入 other_args="-H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock"
:wq!
service docker restart
2.在windows系统环境变量中新建DOCKER_HOST,值为tcp://ip:端口
3.打开dos窗口,即cmd命令行,进入到你要编译的项目文件夹下,
输入mvn clean package docker:build -DskipTests ,然后慢慢等待,直到最后build成功
4)镜像名称/<docker.registry.name>,不能有大小写,改为中划线, [a-z0-9-_.]
5)
e1.docker.repostory:
e2.docker.registry.name:
e3.registryUrl:

四、私有库搭建和使用
1.介绍:
1)和Maven一样,Docker不仅提供了一个中央仓库,同时也允许我们搭建私有仓
2)私有库优势:
a.节省带宽,镜像无需从中央仓库下载,只需从私有仓库中下载即可
b.对于私有仓库中已有的镜像,提升了下载速度
c.便于内部镜像的统一管理
2.registry V2
1)需要Docker版本高于1.6.0。
2)要求使用https访问
3.配置:
1)首先修改两台机器的hosts:docker开发机 node0(192.168.11.143),docker仓库机 node1(192.168.11.144)
配置192.168.11.144 到reg.itmuch.com 的映射:
echo '192.168.11.144 reg.itmuch.com'>> /etc/hosts
2)使用https需要生成证书,使用openssl自签名证书,也可以使用诸如Let’s Encrypt 等工具生成证书,首先在node1机器上生成key
mkdir -p ~/certs
cd ~/certs
openssl genrsa -out reg.itmuch.com.key 2048

再生成密钥文件:
openssl req -newkey rsa:4096 -nodes -sha256 -keyout reg.itmuch.com.key -x509 -days 365 -out reg.itmuch.com.crt
信息需要填写:
Country Name (2 letter code) [XX]:CN # 你的国家名称
State or Province Name (full name) []:JS # 省份
Locality Name (eg, city) [Default City]:NJ # 所在城市
Organization Name (eg, company) [Default Company Ltd]:ITMUCH # 组织名称
Organizational Unit Name (eg, section) []:ITMUCH # 组织单元名称
Common Name (eg, your name or your server's hostname) []:reg.itmuch.com # 域名
Email Address []:eacdy0000@126.com # 邮箱
3)自签名证书,默认是不受Docker信任的,故而需要将证书添加到Docker的根证书中,Docker在CentOS 7中,证书存放路径是/etc/docker/certs.d/域名:
node1:
mkdir -p /etc/docker/certs.d/reg.itmuch.com
cp ~/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/
node0:将生成的证书下载到根证书路径
mkdir -p /etc/docker/certs.d/reg.itmuch.com
scp root@192.168.11.144:/root/certs/reg.itmuch.com.crt /etc/docker/certs.d/reg.itmuch.com/
重新启动node0 和 node1 的Docker
4)在node1 上启动私有仓库
a.切换到根目录中:cd ~
注:-v 挂载了证书,如果不切换到根目录,将会引用不到证书文件
b.启动Docker私有仓库
docker run -d -p 443:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \ # 将“当前目录/certs”挂载到容器的“/certs”
-v /opt/docker-image:/opt/docker-image \
-e STORAGE_PATH=/opt/docker-image \ # 指定容器内存储镜像的路径
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \ # 指定证书文件
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \ # 指定key文件
registry:2
注:挂载/opt/docker-image目录,是为了防止私有仓库容器被删除
b.在node0 上测试,将镜像push到私服
docker pull kitematic/hello-world-nginx
docker tag kitematic/hello-world-nginx reg.itmuch.com/kitematic/hello-world-nginx # 为本地镜像打标签
docker push reg.itmuch.com/kitematic/hello-world-nginx # 将镜像push到私服
d.从私服中下载镜像
docker pull reg.itmuch.com/kitematic/hello-world-nginx
5)配置登录认证
a.为防止端口冲突,我们首先删除或停止之前启动好的私有仓库:
docker kill registry
b.在node机器上创建密码文件,并添加一个用户testuser ,密码是testpassword :
cd ~
mkdir auth
htpasswd -Bbn testuser testpassword > auth/htpasswd
c.在node1机器上切换到~ 目录,并启动私有仓库
docker run -d -p 443:5000 --restart=always --name registry2 \
-v /opt/docker-image:/var/lib/registry \ # 挂载容器内存储镜像路径到宿主机
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/reg.itmuch.com.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/reg.itmuch.com.key \
-v `pwd`/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
registry:2
d.测试:
docker push reg.itmuch.com/kitematic/hello-world-nginx
出现:
461f75075df2: Image push failed
no basic auth credentials
说明需要认证

登录:docker login reg.imuch.com
再次执行:docker push reg.itmuch.com/kitematic/hello-world-nginx

五、其他命令
1.其他
1)访问网址:
curl https://registry-1.docker.io/v2/
2)登录docker :ruihin34是docker hub账号
docker login --username=ruihin34 registry.cn-hangzhou.aliyuncs.com

2.镜像命令
1)查看当前创建的镜像
docker images
2)删除镜像
a.删除某个镜像
docker rmi 镜像名:版本号
b.杀死所有running状态的容器
docker kill $(docker ps -q)
c.删除所有已经停止的容器
docker rm $(docker ps -a -q)
d.删除所有\'untagged/dangling\' ()状态的镜像
docker rmi $(docker images -q -f dangling=true)
e.删除所有镜像:
docker rmi $(docker images -q)
3.容器命令
1)查看当前运行的容器
docker ps
2)进入容器服务器的目录
格式:docker exec -it 容器名 /bin/bash
例:docker exec -it 0fc876f32e8b /bin/bash



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值