官网:https://docs.docker.com/html
1)CentOS7提供私有库(centos-extras),默认是启动状态,若是是禁用状态,则须要启用,大都用户采用yum安装之后续更新。java
2)部分用户下载RPM包安装及维护,主要缘由无互联内网服务器。node
https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/
3)少部分用户于开发测试,选择便利脚本安装。python
1)CE:免费版linux
2)EE:企业版,收费版。web
【注】集群中全部节点基础配置docker
配置主机名与IP映射:shell
$>vim /etc/hosts <IP> <hostname>
关闭selinux:json
$>vim /etc/sysconfig/selinux SELINUX=disabled
关闭防火墙:vim
$systemctl stop firewalld.service 中止firewall $>systemctl disable firewalld.service 禁止开机启动
[root@bigdata ~]# sudo firewall-cmd --state 查看防火墙状态 not running
启用Centos-extras
检查/etc/yum.repos.d/CentOS-Base.repos
禁用enabled=0;启动enabled=1
1)增长国内镜像库阿里
vim /etc/yum.repos.d/centos-extras.repo
[extras] name=CentOS-$release-Extras baseurl=https://mirrors.aliyun.com/centos/7/extras/x86_64 gpgcheck=0
2)安装依赖包(可选)
yum install -y yum-utils device-mapper-persistent-data lvm2
3)配置稳定库
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
执行在/etc/yum.repos.d下生成文件docker-ce.repo
配置都在docker-ce.repo中,默认都是禁用状态。
yum-config-manager --enable docker-ce-edge yum-config-manager --enable docker-ce-test
禁用使用标记--disable
yum install docker-ce或者yum install docker
若是启用多个Docker库,经过yum安装或更新时须要指定版本,默认状况安装的都是最新版,不符合稳定需求。
生产系统你需指定安装版,代替安装最新版,经过sort -r命令将版本从高到低排列。
yum list docker-ce --showduplicates | sort -r
Docker安装后未启动,建立了docker组,但组内无成员。
下图所示,只启动了docker-ce-stable
指定版本安装:yum install <FULLY-QUALIFIED-PACKAGE-NAME>
启动Docker: systemctl start docker systemctl restart docker ==>重启 systemctl status docker ==>状态
验证安装是否成功: docker run hello-world
使用加速器能够提高获取Docker官方镜像的速度。针对Docker客户端版本大于 1.10.0 的用户,您能够经过修改daemon配置文件/etc/docker/daemon.json来使用加速器:
{ "registry-mirrors": ["https://lvsmpvsi.mirror.aliyuncs.com"] }
重启生效:
$>sudo systemctl daemon-reload $>sudo systemctl restart docker
查看环境:
格式:docker COMMAND
## List Docker CLI commands
docker docker container --help
## Display Docker version and info
docker --version docker version docker info
## Excecute Docker image
docker run hello-world
## List Docker images
docker image ls
## List Docker containers (running, all, all in quiet mode)
docker container ls docker container ls --all docker container ls -a -q
default registry endpoint:
https://index.docker.io/v1/
https://hub.docker.com/explore/
执行:docker search tomcat
从Repositry拉取镜像:
docker pull library/tomcat
建立新的空目录,在此目录下建立Dockerfile空文件,定义Dockerfile文件内容。
DockerFile分为四部分组成:
基础镜像信息、维护者信息、镜像操做指令和容器启动时执行指令。
# Use an official Python runtime as a parent image FROM python:2.7-slim # Set the working directory to /app WORKDIR /app # Copy the current directory contents into the container at /app ADD . /app # Install any needed packages specified in requirements.txt RUN pip install --trusted-host pypi.python.org -r requirements.txt # Make port 80 available to the world outside this container EXPOSE 80 # Define environment variable ENV NAME World # Run app.py when the container launches CMD ["python", "app.py"]
指定一个镜像名称,如“friendlyhello”,在包含Dockerfile文件的根目录下建立镜像:
docker build -t friendlyhello .
注意:后面有一个点表示当前路径
运行一个web应用:
咱们尝试使用 docker 构建一个 web 应用程序。
咱们将在docker容器中运行一个 Python Flask 应用来运行一个web应用。
docker pull training/webapp # 载入镜像 docker run -d -P training/webapp python app.py #注意:是大写的P
参数说明:
[root@bigdata ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1a1ffa6b9f1a training/webapp "python app.py" 5 hours ago
这里多了端口信息。
PORTS 0.0.0.0:32768->5000/tcp
Docker 开放了 5000 端口(默认 Python Flask 端口)映射到主机端口 32768 上。
咱们也能够经过 -p 参数来设置不同的端口:
[root@bigdata ~]# docker run -d -p 5000:5000 training/webapp python app.py
docker ps查看正在运行的容器
[root@bigdata ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54319ebccdcd training/webapp "python app.py" 19 seconds ago Up 18 seconds 0.0.0.0:5000->5000/tcp wonderful_kirch 3252d8e8fcb2 training/webapp "python app.py" 3 minutes ago Up 3 minutes 0.0.0.0:32768->5000/tcp gracious_chandrasekhar
容器内部的 5000 端口映射到咱们本地主机的 5000 端口上。
运行应用,经过参数-p,指定主机端口4000与容器端口80映射。
docker run -it --network bridge –name myt1 -p 4000:80 friendlyhello
[root@bigdata ~]# docker run -d -p 4000:80 friendlyhello dd64995754e887314b408eeabc7e226d1dabf9f63762ee7971c29cd82de6930b [root@bigdata ~]# docker container ls CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d66d79469a8f friendlyhello "catalina.sh run" 16 seconds ago Up 14 seconds 8080/tcp, 0.0.0.0:4000->80/tcp amazing_chandrasekhar
中止命令:
docker container stop <Container NAME or ID>
远程存储库拉取并运行镜像,若是本地库不存,则Docker从远程拉取,以下命令:
docker run --network bridge -p 4000:80 username/repository:tag
attach 直接进入容器 启动命令 的终端,不会启动新的进程
docker attach <container>
exec 则是在容器中打开新的终端,而且能够启动新的进程,
格式:
docker exec -it <container> bash|sh docker exec -it myt1 /bin/sh ------>启动一个实例
ls ----->查看实例环境
查看路由:【可见网关为:172.18.0.1】
查看最后一个镜像:
在container 中启动一个长久运行的进程,
不断向stdin输出 hello world ,模拟一个后台运行的服务:
[root@bigdata ~]# docker run -d training/webapp bash -c "while true;do echo hello world; sleep 1; done" 218365afd2c002394f37f337f27918069ebd15737bd79e28283f5ccd2baa6531 [root@bigdata ~]# cat /proc/sys/net/ipv4/ip_forward 1 [root@bigdata ~]# echo 1 > /proc/sys/net/ipv4/ip_forward [root@bigdata ~]# vim /etc/sysctl.conf #插入:net.ipv4.ip_forward=1 则开启动网络转发功能,默认开启 #再输入:sysctl -p 生效 [root@bigdata ~]# [root@bigdata ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 218365afd2c0 training/webapp "bash -c 'while tr..." 2 minutes ago Up 2 minutes 5000/tcp nifty_yonath b75e47ab5579 training/webapp "python app.py" 15 minutes ago Up 15 minutes 0.0.0.0:32769->5000/tcp goofy_swirles d66d79469a8f friendlyhello "catalina.sh run" 22 minutes ago Up 22 minutes 8080/tcp, 0.0.0.0:4000->80/tcp amazing_chandrasekhar # 从一个容器中取日志,查看输出的内容 [root@bigdata ~]# docker logs 218365afd2c0 #容器ID能够写全,也能够不写全 hello world hello world hello world hello world ...... hello world [root@bigdata ~]#
演示可移植性须要上传镜像、编译镜像、运行等。当你发布容器实例到生产环境,须要知道怎么上传镜像到仓库。
建立好的镜像如何在任务地方运行,须要将镜像发布到镜像库。
[root@bigdata dockerdir]# docker login Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one. Username (yangdockerrepos): monamengdocker Password: Login Succeeded
标记镜像定义:
将本地镜像与注册表上的存储库关联,定义格式以下:
username/repository:tag
标记镜像名:
docker tag image username/repository:tag 例如:docker tag friendlyhello john/get-started:part2
[root@bigdata ~]# docker tag friendlyhello john/get-started:part2 [root@bigdata ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE <none> <none> aaa37fbdc41a 8 months ago 649 MB friendlyhello latest 5d6be3b09337 10 months ago 458 MB john/get-started part2 5d6be3b09337 10 months ago 458 MB yangdockerrepos/testrepos friendlyhello-v1 5d6be3b09337 10 months ago 458 MB
例如: [root@bigdata dockerdir]# docker tag friendlyhello monamengdocker/dockertest:test
[root@bigdata ~]# docker tag friendlyhello monamengmeng/dockertest:part3 [root@bigdata ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE dockerapp test 93e4de5579a7 8 months ago 1.08 GB <none> <none> aaa37fbdc41a 8 months ago 649 MB mytomcat v1 5d7f1500ece7 9 months ago 458 MB yangdockerrepos/testrepos friendlyhello-v1 5d6be3b09337 10 months ago 458 MB friendlyhello latest 5d6be3b09337 10 months ago 458 MB john/get-started part2 5d6be3b09337 10 months ago 458 MB monamengmeng/dockertest part3 5d6be3b09337 10 months ago 458 MB
搭建私有库或在docker hub申请帐号用户远程库
例如申请的帐号:yangdockerrepos/testrepos
上传前须要从新标记镜像,不然没法上传(提示拒绝)
即:
docker tag image username/repository:tag
执行修改:
将镜像发布到存储库:
格式:docker push username/repository:tag 执行:docker push yangdockerrepos/testrepos:friendlyhello-v1
再例如:
[root@bigdata dockerdir]# docker push monamengdocker/dockertest:test
[root@bigdata dockerdir]# docker run -p 3000:80 monamengdocker/dockertest:test
那些端口被使用,现有容量下多个容器复本运行,须要衡量软件容器运行实例数量的变化,以此申请更多计算资源。
stack[堆] 是构成特定环境中的 service 集合, 它是自动部署多个相互关联的服务的简便方法,而无需单独定义每一个服务。
stack file 是一种 yaml 格式的文件,相似于 docker-compose.yml 文件,它定义了一个或多个服务,并定义了服务的环境变量、部署标签、容器数量以及相关的环境特定配置等。
Docker-compose.yml定义Docker在生产环境的行为表现,具体能够定义以下所述:
1)image:能够从远程存储库拉取镜像。
2)定义运行实例数,及CPU、内存使用比例限制。
3)失败重启
4)端口映射
5)负载均衡
6)网络,部署后会建立相应网络
参考实例以下:
version: "3" services: web: # replace username/repo:tag with your name and image details image: username/repo:tag //公有或私有镜像库 #配置 deploy: replicas: 5 resources: limits: cpus: "0.1" memory: 50M restart_policy: condition: on-failure ports: - "80:80" networks: - webnet // 自定义网络名称,能够提早建立,提供网络名便可 networks: webnet: // 自定义网络名称,列举上述指定的网络列表;虚拟网络请参考本文档《虚拟网络(Docker前)》
...
【备注】
1)compose文件提供的网络名称(未提早建立),基于swarm上,建立的driver=overlay,scope=swarm。
2)提供已建立的网络名称,则容器加入到指定网络运行。
3)详细Docker虚拟网络,请参考本文档《虚拟网络(Docker前)》。
详细实例以下:
version: "3" services: web: # replace username/repo:tag with your name and image details image: monamengdocker/dockertest:test deploy: replicas: 1 resources: limits: cpus: "0.3" memory: 1024M restart_policy: condition: on-failure ports: - "9080:9080" networks: - webnet1 visualizer: image: docker.io/dockersamples/visualizer:stable ports: - "80:80" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet2 networks: webnet1: webnet2:
格式:docker stack deploy <options>
参数列表:
简写 | 参数 | 说明 |
-c | --compose-file | compose file路径 |
--with-registry-auth | 向Swarm代理发送Registry认证详细信息 |
3.2.2 初始化
运行负载集群应用,在执行部署命令docker stack deploy前,先执行初始化
(使执行命令的节点变为管理节点),
):
[root@bigdata dockerdir]# docker swarm init
[root@bigdata dockerdir]# docker swarm leave
[root@bigdata dockerdir]# docker swarm leave --force
[root@bigdata dockerdir]# docker swarm init
[root@bigdata dockerdir]# docker swarm join-token manager
配置stack名称,如“test”:
docker stack deploy -c docker-compose.yml test
(建立service,若没有这个命令,则下面的docker service ls则为空)【当前路径下执行:/opt/dockerdir】
PS:若出现以下错误:
能够执行:
[root@bigdata dockerdir]# systemctl restart docker Error response from daemon: rpc error: code = 4 desc = context deadline exceeded
docker container ls查看容器实例(5个实例):
接~
另外的镜像实例:
docker service ls
经过docker service inspect --pretty 服务名或ID方式查看服务的详细信息
在不带--pretty参数下,能够查看到Json格式的详细信息
能够查看stack对应配置或启动多少个相关服务
docker stack ls
执行效果:
查看stack配置的服务,在集群中分布状况。
docker stack services [options] STACK
执行效果:
docker stack ps [options] STACK
执行效果:
卸载stack:
docker stack rm test
卸载swarm节点:
docker swarm leave --force
执行效果,若是该节点已是管理节点,须要先执行卸载,从新初始化并添加工做节点:
更新节点信息:
修改Docker-compose.yml实例复本配置,不用停机或杀掉应用,只需从新执行便可:
docker stack deploy -c docker-compose.yml test
部署后建立与stack对应的网络,stack名称“test”对应的网络名称“test_webnet”
查看一下当前 host 的网络结构变化:
新增了一个网桥 br-eaed97dc9a77,这里 eaed97dc9a77 正好新建 bridge 网络 my_net 的短 id。
执行 docker network inspect 查看一下 my_net 的配置信息:
这里172.19.0.0/16是 Docker 自动分配的 IP 网段。
[root@bigdata ~]# netstat -ntlp
https://www.cnblogs.com/wcwen1990/p/7128651.html
1)首先启动集群模式且使当前节点成为集群管理器,执行:
docker swarm init
2)在其它节点执行下述命令,使其加入集群作为工做节点。
docker swarm join --token <TOKEN> HOST:PORT
查看加入工做节点:
docker swarm join-token worker
docker swarm join \ --token SWMTKN-1-3j9k88bimw9p9fkwch9grsbxuebf5rvp65ns24u71ul7a3g5br-74dtk2kcd0ss9p6t1izsms5ln \ 192.168.121.200:2377
查看加入管理节点:
docker swarm join-token manager
3)建立集群==========>能够手工建立集群,远程控制的!!!!!!
使用docker-machine建立virtual machines (VMs),例如建立2个虚拟机:
docker-machine create --driver virtualbox myvm1 docker-machine create --driver virtualbox myvm2
列举已建立的VMs(上述的myvm一、myvm2):
docker-machine ls
4) 初始化集群并添加节点
第1个节点充当集群管理角色,负责执行管理命令及受权工做节点加入集群,其它节点充当工做节点。
主节点:发送命令docker-machine ssh给VMs
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr <myvm1 ip>"
$ docker-machine ssh myvm2 "docker swarm join \ --token <token> \ <ip>:2377"
【备注】以上都是经过docker-machine ssh 与集群VMs交互。
5)集群服务管理
docker service 命令来管理 Swarm 集群中的服务,该命令只能在管理节点运行
6)扩容服务
test为stack名称,作为前缀,若是是web服务则加上后缀“_web”,经过docker stack ps test查看任务名称定义。
docker service scale test_web=3
扩容后的结果,注意“unable to pin image …”,由于没有工做节点(待验证)
执行:docker build -t tomcatdemo .
unable to prepare context: unable to evaluate symlinks in Dockerfile path: lstat /opt/dockerdir/Dockerfile: no such file or directory
解决办法:DockerFile—> Dockerfile
镜像拉取常常超时
1)国内镜像(网易)
docker pull hub.c.163.com/library/tomcat
2)手动配置 Docker 加速器(daocloud)
适用于各类 Linux 发行版,Docker 版本在 1.12 或更高,建立或修改 /etc/docker/daemon.json 文件,修改成以下形式:
{ "registry-mirrors": [ "加速地址" ], "insecure-registries": [] }
镜像导出:
docker save -o kube-proxy-amd64-v1.11.2.tar(自定义名称) k8s.gcr.io/kube-proxy-amd64:v1.11.2 // 本地镜像
启动问题
仔细分析,发现“unable to configure the Docker daemon with file /etc/do…EOF”
缘由:前期增长自定义配置文件/etc/docker/daemon.json,文件内容为空,就是由于
文件内容为空因此启动不了。
删除daemon.jso*或者修改daemon.json,添加如下信息:(注意英文输入!)
{ "debug":true }
部署服务后,查看任务运行异常:"task: non-zero exit (137)"
官网给出与Java application有关,参考《https://success.docker.com/article/what-causes-a-container-to-exit-with-code-137》
本地由于compose文件配置的内存过小,调整内存后,启动运行正常。
直接使用docker swarm集群(未安装docker-machine),部署应用服务至swarm集群,启动集群时,worker节点拉取不到镜像。
(1)集群信息以下:
bigdata:master bigdata1:worker
(2)docker-compose.yml配置文件以下:
version: "3" services: web: # replace username/repo:tag with your name and image details image: yangdockerrepos/testrepos:dkapptest_1.0 deploy: replicas: 2 resources: limits: cpus: "0.3" memory: 1024M restart_policy: condition: on-failure ports: - "4000:8888" networks: - webnet1 visualizer: image: docker.io/dockersamples/visualizer:stable ports: - "8080:8080" volumes: - "/var/run/docker.sock:/var/run/docker.sock" deploy: placement: constraints: [node.role == manager] networks: - webnet2 networks: webnet1: webnet2:
执行启动:docker stack deploy -c docker-compose3.yml dtest
bigdata1拉取不到镜像启动容器实例失败,致使2个容器实例都在bigdata启动。
(3)解决办法:暂未解决
It is highly recommended that you use the overlay2 driver if possible, rather than the overlay driver. The overlay driver is not supported for Docker EE.
To configure Docker to use the overlay storage driver your Docker host must be running version 3.18 of the Linux kernel (preferably newer) with the overlay kernel module loaded. For the overlay2 driver, the version of your kernel must be 4.0 or newer.
docker stop 中止,集群不会启动实例
如下方式会启动新实例:
1)kill容器
2)docker service update test_web
默认状况docker配置文件于/etc/docker/daemon.json,docker默认日志级别info,日志输出位置/var/log/messages,修改日志级别2种方式:
1)启动时指定
dockerd –log-level debug
2)修改配置文件daemon.json
{ “log-level”:true }
备注:其它安装信息,执行docker info查看
查询镜像:
docker search registry [root@bigdata ~]# yum list docker-ce --showduplicates | sort -r
拉取镜像到本地(默认tag=latest):
docker pull docker.io/registry
查看本地
启动容器实例:
docker run -d -p 5000:5000 --restart=always --name=registry-server -v /var/local/registry:/var/lib/registry registry
查看容器是否启动成功:docker ps
请求查看私有镜像列表:curl -X GET http://127.0.0.1:5000/v2/_catalog
配置私有镜像库:
docker 默认使用https上传镜像至仓库;如下修改使用http且配置本地私有镜像库:
vim /etc/docker/daemon.json
{ "insecure-registries": [“192.168.2.33:5000”] }
若本地存在1个镜像:
从新作标记:
[root@bigdata ~]# docker tag docker.io/registry:latest 192.168.2.32:5000/registry:latest
上传私有目标镜像仓库:
装完Docker后,它会自动建立三个network(bridge/host/none),这个bridge network 表明全部安装了Docker的主机的docker0 network。
除非使用docker run --set=<NETWORK>选项指定一个其它的network,不然Docker daemon会默认使用这个network链接contrainer,你可使用如下命令查询网络列表:
docker network ls
ifconfig命令查看主机的network stack中的docker0:
查看网络详细,给定的network回显的这个network已链接的容器和它的一些网络资源,执行以下命令:
docker network inspect
链接或加入这个容器并查看它的stack
docker attach <CONTAINER ID>
Docker容器拥有本身的Network Namespace,可是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。
须要咱们本身为Docker容器添加网卡、配置IP等。使用此种网络的容器会彻底隔离。
若是启动容器的时候使用host模式,那么这个容器将不会得到一个个独立的Network Namespace,而是和宿主机共用一个Network Namespace。
容器将不会虚拟出本身的网卡,配置本身的IP等。而是使用宿主机的IP和端口。
可是,容器的其余方面,如文件系统、进程列表等仍是和宿主机隔离的。
只有这种网络的容器会使用主机的网络,这种网络对外界是彻底开放的,可以访问到主机,就能访问到容器。
在不指定--network参数 或者 --network=bridge 的状况下建立的容器其网络类型都是bridge。
Docker在安装时会在宿主机上建立名为docker0的网桥,所谓网桥至关于一个虚拟交换机,若是使用上述两种方式run的容器都会挂到docker0上。
容器和docker0之间经过veth进行链接,veth至关于一根虚拟网线,链接容器和虚拟交换机,这样就使docker0与容器连通了.
有点像主机与容器之间的一座桥,对容器有一点隔离做用。实际是在iptables作了NAT规则,实现端口转发功能。可使用 iptables -t nat -vnL 查看。
[root@bigdata ~]# iptables -t nat -vnL Chain PREROUTING (policy ACCEPT 311 packets, 24638 bytes) pkts bytes target prot opt in out source destination 2 104 DOCKER-INGRESS all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL 763 58912 PREROUTING_direct all -- * * 0.0.0.0/0 0.0.0.0/0 763 58912 PREROUTING_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0 763 58912 PREROUTING_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0 75 3932 DOCKER all -- * * 0.0.0.0/0 0.0.0.0/0 ADDRTYPE match dst-type LOCAL Chain INPUT (policy ACCEPT 2 packets, 104 bytes) ......
Docker提供三种user-defined网络驱动:bridge,overlay和macvlan。overlay和macvlan用于建立跨主机的网络,建立网络命令以下:
docker network create -d bridge --subnet 172.10.0.0/24 --gateway 172.10.0.1 my_net
-d bridge表示自定义网络的驱动为bridge
--subnet 172.10.0.0/24 --gateway 172.10.0.1分别指定网段和网关。
为容器指定自定义网络:
docker run -it --network my_net --ip 172.10.0.3 busybox
IP通讯就是直接用IP地址来进行通讯,根据上面的分析须要保证两个容器处于同一个网络,那么若是不在同一个网络如何处理。
若是是实体机咱们很容易理解,只须要为其中一台服务器添加一块网卡链接到另外一个网络就能够了。容器同理,只须要为其中一个容器添加另一个容器的网络就能够了。使用以下命令:
docker network connect my_net httpd
connect命令可以为httpd容器再添加一个my_net网络(假设httpd原来只有默认的bridge网络)。这样上面建立的busybox容器就能与这次connect的httpd容器进行通讯。
iptables -t nat -nL
https://docs.docker.com/storage/storagedriver/overlayfs-driver/
SNAT/DNAT:
https://blog.csdn.net/windeal3203/article/details/51111543
国内/外镜像:
http://www.javashuo.com/article/p-zcplkfah-hb.html
Dockerfile(镜像描述文件,文件内容请参考下述)、SpringBootTestApplication(微服务应用)
SpringBootTestApplication目录结构:
dockerApp:应用文件,包括配置、依赖包、业务开发类库
startService-linux.sh:linux 启动微服务脚本
startService-linux.sh:windows启动微服务脚本
dockerApp目录结构:
config:微服务配置文件
dockerApp-1.0.0-20180831.jar:业务开发逻辑类库
lib:微服务依赖第三方类库
$>docker pull java:8
Dockerfile文件内容,第1行必须是From,继承其它基础镜像(如操做系统等),此处构建应用级别能够把JDK做为基础镜像。
COPY SpringBootTestApplication /usr/local/SpringBootTestApplication 将Dockerfile文件所在目录下的文件夹SpringBootTestApplication拷备至容器(能够看做集成微操做系统)指定目录下/usr/local/SpringBootTestApplication
与COPY相似的命令为ADD,ADD支持能够从url下载,支持解压等操做,其它操做与COPY相同,从本地操做系统拷备文件至容器。
EXPOSE:暴露容器端口
WORKDIR:设置工做目录(切换工做目录,后续的RUN、CMD、ENTRYPOINT 都是相对此目录操做)。
ENTRYPOINT:执行脚本文件,容器启动时启动微服务
FROM java:8 # Copying jdk from OS directory which DockerFile file directory to image directory #COPY jdk1.8.0_144 /usr/local/jdk1.8.0_144 # Configure jdk enviroment #ENV JAVA_HOME /usr/local/jdk1.8.0_144 #ENV PATH $PATH:$JAVA_HOME/bin:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar # Copy application package include start application shell script COPY SpringBootTestApplication /usr/local/SpringBootTestApplication EXPOSE 8888 WORKDIR /usr/local/SpringBootTestApplication RUN pwd ENTRYPOINT ["./startService-linux.sh"]
docker build -t dockerapp:test . -f Dockerfile
错误:Please provide a source image with `from` prior to commit 缘由:Dockerfile第1行必须是from 基础镜像
启动容器实例:
docker run -d -it --name dtest -p 4000:8888 dockerapp:test
查看及分析容器实例运行的日志(包括应用程序log4j日志)
docker container logs -f <container>
查看容器运行所处环境及目录结构
docker exec -it <container> /bin/bash
测试微服务是否启动正常
http://ip:4000/dockerApp/test/log
注意:4000端口加入防火墙过滤端口
firewall-cmd --zone=public --add-port=4000/tcp –permanent //添加端口过滤 firewall-cmd –reload //从新加载
1.查看CPU信息
[root@bigdata ~]# top
2.进行压力测试
查看CPU内核:
[root@bigdata proc]# cat /proc/cpuinfo
[root@bigdata proc]# docker run -it --rm stress --cpu 1
【--rm:建立完镜像即删除】
查看cpu占用状况【再开一个终端】
[root@bigdata proc]# top
若开两个终端执行:
[root@bigdata proc]# docker run -it --rm stress --cpu 1
依赖第13节微服务镜像,本节增长本机数据目录与容器数据目录映射、容器之间共享同一数据目录。
1)容器中的数据会随着容器的中止运行而消失, 并且当其余的进程须要这些数据时,很难将这些数据从容器中提取出来。
2)容器的数据写入层是紧密地对应着他的宿主操做系统的,数据不能容易的被迁移到其余地方。
3)要将数据写入到容器的数据写入层,须要一个特定的存储驱动,利用linux内核构建一个统一的文件系统,来管理宿主和容器的文件系统。这层额外的虚拟化显然会下降性能。为了不性能降低,docker使用data volumes的方式,直接对宿主文件系统进行写操做。
/var/lib/docker/graph 存放本地iamge的分层信息 /var/lib/docker/devicemapper/devicemapper/data存储了image与Container的二进制文件 /var/lib/docker/devicemapper/devicemapper/metadata 存储了相关元数据
[root@bigdata proc]#mkdir -p /var/run/netns
[root@bigdata proc]# ln -s /proc/30046/ns/net /var/run/netns/30046
[root@bigdata proc]# ip netns exec 30046 Iethtool -S ens33
在本空间执行 ip a
(一)Data Volume
1)Dockerfile文件定义,如:volume /data
2)docker run指定参数-v,如:
docker run -d -it -p 4000:8888 -v /data:/usr/local/webapp dockerapp:test(主机与容器映射) docker run -d -it -p 4000:8888 -v /usr/local/webapp dockerapp:test(容器目录)
3)--volumes-from(数据共享)
相关的容器部署到同一个主机上,这时候但愿这些容器之间能够共享一些数据。
这时,咱们能够建立一个数据卷容器,而后就能够供多个容器挂载使用了。
(二)Data Container
容器之间共享数据,最好是使用 data container。这种 container 中不会跑应用,而只是挂载一个卷。
建立Data Container:
docker create -v /dbdata --name dbstore training/webapp /bin/true
启动一个应用,引用Data Container
docker run -d -P --name web3 --volumes-from dbstore training/webapp python app.py
查看数据目录挂载:
docker inspect <container name>
能够看到已经挂载成功,而且容器对这个目录具备读写权限
测试:
解决方法:
未解决!!
[root@bigdata dockerfiletest]# docker run -d docker.io/centos:latest /bin/sh -c "while true;do echo hello world;sleep 1;done" 843073ddc58beb128f0b76bed533cc37e715de50c138655bf3fd1bed09808231 [root@bigdata dockerfiletest]#
从一个容器中取出id,查看输出的内容
[root@bigdata dockerfiletest]# docker logs 843073ddc58b
hello world hello world hello world hello world hello world hello world ......
Dockerfile
FROM docker.io/centos:latest MAINTAINER <monamengdocker> RUN yum -y install httpd ADD start.sh /usr/local/bin/start.sh ADD index.html /var/www/html/index.html #CMD echo hello world
[root@bigdata dockerfiletest]# echo "/usr/sbin/httpd - DFOREGROUND" > start.sh [root@bigdata dockerfiletest]# chmod a+x start.sh [root@bigdata dockerfiletest]# echo "docker image build test" > index.html [root@bigdata dockerfiletest]# ls Dockerfile index.html start.sh [root@bigdata dockerfiletest]# docker build -t docker.io/centos:httpd ./ Sending build context to Docker daemon 4.096 kB Step 1/6 : FROM docker.io/centos:latest ---> 9f38484d220f Step 2/6 : MAINTAINER <1975772722@qq.com> ---> Using cache ---> 8f39f24f9c0c Step 3/6 : RUN yum -y install httpd ---> Running in 37cea7021025 ......
[root@bigdata dockerfiletest]# docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh c0e3edf0613e9b44eee0012728009b57890765e9339e1d43ba7a133981e6f240 [root@bigdata dockerfiletest]# [root@bigdata dockerfiletest]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 843073ddc58b docker.io/centos:latest "/bin/sh -c 'while..." 12 minutes ago Up 12 minutes ......
[root@bigdata dockerfiletest]# vim Dockerfile [root@bigdata dockerfiletest]# docker run -d -p 80:80 docker.io/centos:httpd /bin/bash -c /usr/local/bin/start.sh 1f39060ddf49e37ab0aabb848673b9415d144e3f4dec6b59a835094f0b6bea5e
[root@bigdata dockerfiletest]# netstat -antup | grep 80
[root@bigdata dockerfiletest]# ll docker.io-centos-httpd-docker-image.tar -rw------- 1 root root 337563136 5月 25 10:22 docker.io-centos-httpd-docker-image.tar [root@bigdata dockerfiletest]#