一,介绍
Docker是一个基于LXC技术构建的容器引擎,基于GO语言开发,更支持linux。作用是可以把一台服务器隔离成一个一个的容 器,每个容器可以运行不同的应用,每个容器之间是相互隔离的,并且容器的创建和停止都非常快,容器占用的资源有限。
二,名词
Container(容器):Docker将宿主机隔开的一个个独立空间。
Image(镜像):一个特殊的文件系统,即对某一早时刻容器状态的备份。
Registry(记录中心):下载镜像的地方。
https://hub.docker.com/ //docker官网,在国外,访问慢
https://dev.aliyun.com/search.html //阿里云
https://c.163yun.com/hub#/m/home/ //网易云
三,网络配置
host模式:和当前宿主机共用一个网络配置。
container模式:共用已有的容器的网络配置。
none模式:不配置,也就是不能网络通信。
bridge模式(默认):最常用的配置,为当前的容器分配一个没被占用的IP,若不指定IP,IP地址会按顺序递增。
四,端口映射
命令-p
五,Docker安装与使用
安装:Ubuntu系统本地安装,命令:apt-get install -y docker.io
启动:(sudo)service docker start //sudo 如果在root权限不用加
停止:service docker stop
查看版本:docker --version 或者 docker -v
查看镜像:docker images
搜索镜像:docker search 镜像关键词
镜像垃取:docker pull 镜像名称
镜像删除:docker rmi 镜像id或镜像名称
生成容器:docker run -d -p 8888:8080 --name 取的容器名 镜像名
-d:表示后台运行
-p:端口映射,8080容器里应用的端口,8888映射后访问的端口
查看容器:
查看正在运行的容器:docker ps 或者 docker ps|grep 容器关键词
查看全部的容器:docker ps -a 或者 docker ps -a|grep 容器关键词
进入容器:docker exec -it 容器的id/容器的名称 /bin/bash
进入后可以访问里面的文件:比如Tomcat容器:usr/tomcat/webapps/root
退出容器:exit
停止容器:docker stop 容器ID或者名称
启动容器:docker start 容器ID或者名称
删除容器:docker rm 容器ID或者名称
拷贝文件:docker cp 宿主机目录及文件 容器名称:容器目录
设置固定IP:
1,创建网络,指定网段:docker network create --subnet=172.18.0.0/16 网络名称
2,创建容器,指定IP:docker run -d -it --net 网络名称 --ip 172.18.0.8 --name 取的容器名 镜像名
查看容器的IP:
查看容器的所有信息(包括IP):docker inspect 容器ID
查看所有容器的IP:
docker inspect --format='{{.name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -ap)
六,dockerfile
脚本文件,内置了命令,执行脚本文件生成镜像,解决多个容器发布相同的文件每个人生成容器的环境不一样的问题,更佳规范,统一,方便传播。
1,编写Dockerfile文件
文件的名称必须为Dockerfile,下面命令不一定要全写。
FROM:依赖的底层镜像名称
MAINTAINER:指定镜像创建者
ENV:设置环境变量
RUN:运行shell命令
COPY:将编译机本地文件拷贝到镜像文件系统中 //copy usr/index.jsp usr/tomcat/webapps/ROOT/
EXPOSE:指定监听端口 // EXPOSE 8080/tcp
ENTRYPOINT:预执行命令,创建容器并启动后才执行
2,执行命令生成镜像:docker build -t 取的镜像名称 Dockerfile文件的目录
七,容器可视化
操作界面工具:DockerUI和Shipyard
1,Shipyard的安装
需要防火墙开方4001端口:sudo ufw allow 4001--
安装命令:
docker pull rethinkdb
docker pull microbox/etcd
docker pull shipyard/docker-proxy
docker pull swarm
docker pull shipyard/shipyard
docker run -ti -d --restart=always --name shipyard-rethinkdb rethinkdb
docker run -ti -d -p 4001:4001 -p 7001:7001 --restart=always --name shipyard-discovery microbox/etcd:latest -name discovery
docker run -ti -d -p 2375:2375 --hostname=$HOSTNAME --restart=always --name shipyard-proxy -v /var/run/docker.sock:/var/run/docker.sock -e PORT=2375 shipyard/docker-proxy:latest
docker run -ti -d --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:3375 etcd://当前机器的IP:4001
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr 当前机器的IP:2375 etcd://当前机器的IP:4001
docker run -ti -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 8080:8080 shipyard/shipyard:latest server -d tcp://swarm:3375
2,访问Shipyard管理界面:URL:localhost:8080 用户:admin 密码:shipyard
八,搭建抢购网环境
1,安装Ubuntu16.04系统
安装SSH服务
解决远程SSH连接root用户拒绝问题
2,安装docker
3,安装Shipyard
4,下载基础镜像
docker pull centos
5,创建镜像
a,上传环境文件
b,给sh文件授权 chmod 777 *.sh
c,执行创建镜像脚本
全部执行: ./im-1.sh(文件名称) all n
指定执行:./im-1.sh文件名称 镜像名称 n dockerfile文件地址 打开im-1.sh脚本文件,images[]="镜像名称",paths[]="dockerfile文件地址"
6,创建容器
./InitContainers-2.sh init
7,开始配置
配置MySQL
配置Redis
配置nginx
8,分布式ID生成器,发布到容器
//公共的接口项目
public interface IdWorkerService{
public long getId();
}
//提供者项目
@Component
@Service(interfaceClass=IdWorkerService.class) //注册到注册中心
public class IdWorkerServiceImp implements IdWorkerService{
public long getId(){
try{
//通过时间标识,机器标识算法获取唯一ID
return IdWorker.getFlowIdWorkerInstance().nextId();
}catch(Exception e){
return 0;
}
}
}
//消费者项目
@RestController
public class IdWorkerController{
@DubboConsumer
private IdWorkerService idWorkerService;
@RequestMapping("getId")
public IdWorker getId(){
long id = idWorkerService.getId();
IdWorker idWorker = new IdWorker();
idWorker.setId(id);
if(id<=0){
idWorker.setId(0);
}
return idWorker;
}
}