官网:https://docs.docker.com/
1)CentOS7提供私有库(centos-extras),默认是启动状态,如果是禁用状态,则需要启用,大都用户采用yum安装以后续更新。
2)部分用户下载RPM包安装及维护,主要原因无互联内网服务器。
https://mirrors.aliyun.com/centos/7/extras/x86_64/Packages/
3)少部分用户于开发测试,选择便利脚本安装。
1)CE:免费版
2)EE:企业版,收费版。
【注】集群中所有节点基础配置
配置主机名与IP映射:
$>vim /etc/hosts
关闭selinux:
$>vim /etc/sysconfig/selinux SELINUX=disabled
关闭防火墙:
$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
启动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
远程存储库拉取并运行镜像,如果本地库不存,则Docker从远程拉取,如下命令:
docker run --network bridge -p 4000:80 username/repository:tag
attach 直接进入容器 启动命令 的终端,不会启动新的进程
docker attach
exec 则是在容器中打开新的终端,并且可以启动新的进程,
格式:
docker exec -it 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
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
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
参数列表:
简写 | 参数 | 说明 |
-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
Docker容器与容器云之Docker单机集群部署案例
https://www.cnblogs.com/wcwen1990/p/7128651.html
1)首先启动集群模式且使当前节点成为集群管理器,执行:
docker swarm init
2)在其它节点执行下述命令,使其加入集群做为工作节点。
docker swarm join --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(上述的myvm1、myvm2):
docker-machine ls
4) 初始化集群并添加节点
第1个节点充当集群管理角色,负责执行管理命令及授权工作节点加入集群,其它节点充当工作节点。
主节点:发送命令docker-machine ssh给VMs
$ docker-machine ssh myvm1 "docker swarm init --advertise-addr "
$ docker-machine ssh myvm2 "docker swarm join \
--token \
: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=
docker network ls
ifconfig命令查看主机的network stack中的docker0:
查看网络详细,给定的network回显的这个network已连接的容器和它的一些网络资源,执行如下命令:
docker network inspect
连接或加入这个容器并查看它的stack
docker attach
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/
https://www.cnrancher.com/
SNAT/DNAT:
https://blog.csdn.net/windeal3203/article/details/51111543
国内/外镜像:
https://blog.csdn.net/nklinsirui/article/details/80581286
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
查看容器运行所处环境及目录结构
docker exec -it /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
可以看到已经挂载成功,并且容器对这个目录具有读写权限
测试:
解决方法:
未解决!!
[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
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 <[email protected]>
---> 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]#