- 什么是docker
Docker是一个基于LXC技术构建的容器引擎,基于GO语言开发,遵循Apache2.0协议开源
与虚拟机的区别
(1)docker有着比虚拟机更少的抽象层。由于docker不需要hypervisor
实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。
因此在cpu1,内存利用率上docker将会在效率上有明显优势。
(2)docker利用的是宿主机的内核,而不需要Guest OS,因此,当新建一个容器时,docker
不需要和虚拟机一样重新加载一个操作系统内核。避免了加载操作系统内核这个比较费时费资源的过程
,当新建一个虚拟机时,虚拟机需要加载Guest OS,这个过程是分钟级别的。而docker由于
直接利用宿主机的操作系统,因此新建一个docker容器只需要几秒钟。
docker容器 | 虚拟机vm | |
---|---|---|
操作系统 | 与宿主机共享os | 宿主机os上运行虚拟机os |
存储大小 | 镜像小,便于存储与传输 | 镜像大(vmdk,vmi等) |
运行性能 | 几乎无额外的性能损失 | 操作系统额外的cpu,内存消耗 |
移植性 | 轻便,灵活,适应于linux | 笨重,与虚拟化技术耦合度高 |
硬件亲和性 | 面向软件开发者 | 面向硬件运维者 |
部署速度 | 快速,秒级 | 较慢,10s以上 |
- 基本概念
Container:
Docker Container(容器)即Docker将宿主机隔开的一个个独立空间
Image:
Docker Image(镜像)可以看作是一个特殊的文件系统,即对某一时刻容器状态的备份
Docker Registry:
Docker镜像仓库中心
https://hub.docker.com/
https://dev.aliyun.com/search.html
https://c.163yun.com/hub#/m/home/
在ubuntu系统中配置阿里云镜像加速
这一步很重要,否则后面的下载非常慢。
-
Docker安装
安装本地版本:apt-get install -y docker.io
启动服务:(sudo )service docker start
查看版本:docker --version | docker -v
查看镜像:docker images -
Docker镜像操作
查看镜像
docker images
搜索镜像
docker search 镜像关键词
镜像拉取
docker pull [OPTIONS] NAME[:TAG|@DIGEST]
镜像删除
docker rmi 镜像Id或镜像名称 -
Docker容器操作
生成容器
docker run -d -p 8888:8080 --name tomcat-test tomcat
查看容器
查询正在运行的容器:docker ps|grep 容器关键词
查询全部(包括已停止)的容器:docker ps -a|grep 容器关键词
进入容器
docker exec -it containerId/containerName /bin/bash
退出容器
exit
停止容器
docker stop containerId/containerName
启动容器
docker start containerId/containerName
删除容器
docker rm containerId/containerName
拷贝文件
docker cp 宿主机目录及文件 容器名称:容器目录
查看容器ip
docker inspect --format ‘{{.Name}} - {{ range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ $(docker ps -aq)
或者
docker inspect
其他:
停止docker:
docker stop $(docker ps -a | grep “Exited” | awk ‘{print $1 }’)
删除docker:
docker rm $(docker ps -a | grep “Exited” | awk ‘{print $1 }’)
删除images:
docker rmi $(docker images | grep “none” | awk ‘{print $3}’)
删除在运行的容器:
docker rm -f $(docker ps -q)
列出镜像的变更历史:
docker history 镜像名 -
Docker网络配置与端口映射
网络配置
host 模式
container 模式
none 模式
bridge 模式,默认
–net=(具体模式名称)
端口映射
-p
固定IP
创建网络,指定网段
docker network create --subnet=172.18.0.0/16 mynetwork
创建容器,指定IP
docker run -it -d --net mynetwork --ip 172.18.0.8 --name mytomcat tomcat -
Dokerfile
内置命令
FROM :依赖的底层镜像
MAINTAINER :指定镜像创建者
ENV : 设置环境变量
RUN :运行shell命令
COPY : 将编译机本地文件拷贝到镜像文件系统中
EXPOSE : 指定监听端口
ENTRYPOINT :与执行命令,创建容器并启动后才执行
#
# JDK-8U151
#
FROM yi/centos7-ssh
MAINTAINER Yi.Ma <findlymw@gmail.com>
RUN yum clean all
RUN yum -y update
# Install libs
RUN yum install deltarpm rpm make wget tar unzip \
gcc gcc-c++ -y
RUN mkdir -p /home/work/apps/
RUN mkdir -p /usr/local/java/
WORKDIR /home/work/apps/
RUN wget --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie;" http://download.oracle.com/otn-pub/java/jdk/8u161-b12/2f38c3b165be4555a1fa6e98c45e0808/jdk-8u161-linux-x64.tar.gz
RUN tar -zxvf jdk-8u161-linux-x64.tar.gz
RUN rm jdk-8u161-linux-x64.tar.gz
RUN mv -f jdk1.8.0_161/ /usr/local/java/jdk1.8.0_161
ENV JAVA_HOME=/usr/local/java/jdk1.8.0_161
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
# open ports
EXPOSE 22
编写Dockerfile文件的名称必须为Dockerfile
执行命令生成镜像
docker build [OPTIONS] PATH | URL | -
- 安装shipyard
#下载镜像
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
#<IP-OF-HOST> 需要替换为docker的IP
docker run -ti -d --restart=always --name shipyard-swarm-manager swarm:latest manage --host tcp://0.0.0.0:3375 etcd://<IP-OF-HOST>:4001
docker run -ti -d --restart=always --name shipyard-swarm-agent swarm:latest join --addr <ip-of-host>:2375 etcd://<ip-of-host>:4001
docker run -ti -d --restart=always --name shipyard-controller --link shipyard-rethinkdb:rethinkdb --link shipyard-swarm-manager:swarm -p 9090:8080 shipyard/shipyard:latest server -d tcp://swarm:3375
#注意8080端口有可能与tomcat重复(已经改成了9090)
#需要开放4001端口 sudo ufw allow 4001