安装Docker
yum安装
mkdir /docker-data
vim /usr/lib/systemd/system/docker.service
给根目录下添加doker的配置及数据文件
阿里容器镜像服务
常用docker命令
systemctl enable docker --now
#开机自启动docker
docker info #查看docker的情况
docker run -itd nginx:latest #运行一个新的容器,一次run都是开启一个新的容器
#i标准输入标准输出
#t虚拟终端
#d后台运行
镜像管理命令
docker search image_name:V #从docker库中查找镜像
docker search -f starts=100 image_name:V #从docker库中找星级高于100的镜像
docker pull image_name:V #拉取镜像
docker tag image_name:V new_image_name:V #重命名镜像
docker rmi image_name:V #删除镜像,删除多个用空格隔开
docker rmi -force image_name:V #强制删除-f
docker rmi $(docker images -q) #删除所有镜像
docker images #查看所有的镜像
docker image ls #查看所有的镜像
docker image list #查看所有的镜像
docker image inspect image_id #查看镜像详情
docker images -q #查看所有镜像id
容器管理命令
docker create -itd image_id #创建容器
#-i捕获标准输入/输出
#-t 分配一个虚拟终端
#-d 后台运行
docker ps #查看启动的容器;-l查看最近一次启动的容器
docker start c_id/c_name #启动容器
docker run -itd image_name:V/image_id #创建并启动
docker run -itd --name your_name -p 80:80 image_name:V/image_id
#自定义容器名(容器名不得重复),自定义端口映射-p;-P随机端口映射32768开始
#-v数据持久化
#-e 环境变量
#--restart=always 总是重启
docker run -itd --name your_name -P -v /web:/usr/share/nginx/index.html nginx:Version
ctrl+p+q (退出容器,但是容器不停止)
ctrl+d (退出容器,容器停止)
docker attach c_id/c_name #进入容器(c_id/c_name)在docker ps中查看
ctrl+p+q (退出容器,但是容器不停止)
ctrl+d (退出容器,容器停止)docker exec -it c_id/c_name /bin/bash #进入容器
docker exec -it c_id/c_name touch a.sh #进入容器并创建文件
docker rm -f #删除正在运行的容器
docker pause c_id/c_name #暂停容器
docker logs c_id/c_name #查看容器的日志
docker rename c_name new_name #重命名
docker stats #查看docker占用资源情况
docker状态
创建
退出
运行
重启
暂停
激活
docker run -d \ #创建并运行一个新的容器,-d后台运行
--name mysql \ #给容器命名,必须唯一
-p 3306:3306 \ #端口映射 宿主机端口:容器内端口
-e TZ=Asia/Shanghai \ #设置环境变量key=value
-e MYSQL_ROOT_PASSWORD=123 \
mysql:5.7 #指定运行镜像的名字:镜像版本
镜像迁移
保存一台宿主机上的镜像为tar文件,然后可以导入到其他的宿主机上
save
docker save -o nginx.tar nginx:tag
load
docker load < nginx.tar
dockerfile
是一个包含于组合映像的命令的文本文档,
docker build 命令用于从Dockerfile构建镜像,可以在docker build -f 标志指向文件系统中任何位置的dockerfile。
dockerfile 的基本结构
基础镜像信息 |
维护者信息 |
操作镜像指令 |
容器启动时的执行指令 |
dockerfile文件说明
Docker从上到下运行dockerfile的指令。为了指定基本映像,第一条指令必须是FROM
FROM:指定基础映像,必须是第一个命令
MAINTINER:维护者信息
RUN:构建镜像时的命令
shell
exec
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,累死于wget
COPY:功能类似于ADD但是不会自动解压文件,也不能访问网络资源
CMD:构建容器和后调用,也就是容器启动时才进行调用
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去‘application‘,只使用参数
LABEL:用于镜像添加元数据
ENV:设置环境变量
EXPOSE:指定与外界交互的端口
VOLUME:用于持久化目录
WORKDIR:工作目录,类似于cd
USER:指定运行容器的用户名或uid
ARG:用于指定传递给构建运行时的变量
ONBUILD:用于设置镜像触发器
nginx.eg
# This my first nginx Dockerfile
# Version 1.0# Base images 基础镜像
FROM centos#MAINTAINER 维护者信息
MAINTAINER tianfeiyu#ENV 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH#ADD 文件放在当前目录下,拷过去会自动解压
ADD nginx-1.8.0.tar.gz /usr/local/
ADD epel-release-latest-7.noarch.rpm /usr/local/#RUN 执行以下命令
RUN rpm -ivh /usr/local/epel-release-latest-7.noarch.rpm
RUN yum install -y wget lftp gcc gcc-c++ make openssl-devel pcre-devel pcre && yum clean all
RUN useradd -s /sbin/nologin -M www#WORKDIR 相当于cd
WORKDIR /usr/local/nginx-1.8.0RUN ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-pcre && make && make install
RUN echo "daemon off;" >> /etc/nginx.conf
#EXPOSE 映射端口
EXPOSE 80#CMD 运行以下命令
CMD ["nginx"]
本地容器Harbor
docker资源限制
docker run -it --rm image_id/image_name --cpu 4 #这是没有限制的情况
docker rum -it --rm -c 512 image_id/image_name --cpu 4
#-c 限制cpu为一半,cpu的总和为1024,整个容器的cpu大小为1024
限制cpu的核心数
docker run -it --rm -=-cpus 1.5 image_id/image_name --cpu 3
#将3核心的机器限制为1.5个核心数 --cpus 代表着最多的核心数,以10毫核作为基础怕单位,可精确到0.01core
cpu的绑定:限制容器运行在CPU的某些核心
coekr run -it --rm --cpu-set=0,1 image_id/image_name --cpu 2
端口转发
-p:端口映射
docker run -d --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=YOUR-PASSWD daocloud.io/library/mysql:5.7
-P:当使用P标记时,docker会随机映射端口,32768~49900 的端口到内部容器开放的网络端口
docker run --name myredis -P -d daocloud.io/library/redis
容器/数据卷(数据持久化)
把本地宿主机上的某一个目录挂载到容器里面的目录上去。这两个目录都不用提前存在,会自动创建
数据卷的特点
独立于容器存在;
数据卷的修改可直接实时生效;
容器与数据卷的关系是N:M;
数据卷中的更改不会包含在镜像的更新中;
docker run -it --name mynginx -v /test:/test2 daocloud.io/library/nginx /bin/bash
#新卷只能在容器创建的过程中挂载
Docker数据存储位置
#查看存储路径
docker info | grep Root
#修改默认的存储位置
在dockerd启动命令后追加--data-root参数来制定新的位置
vim /usr/lib/systemd/system/docker.server
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --data-root=/data
systemctl daemon-reload
systemctl restart docker
Docker 网络
网络模式
docker natwork list
bridge:网桥
默认情况下启动、创建容器的模式。所以每次docker容器重启时会按照顺序获取对应的IP地址
none:无指定网络
启动容器时,可以通过--network=none,docker容器不会分配局域网IP
host:主机网络
docker容器和主机共用一个IP地址,使用host网络创建容器
docker run -it --name nginx --net host id
netstat -nplt | grep 80
固定IP:创建固定IP的容器
创建自定义类型,并且指定网段
docker network create --subnet=192.168.0.0/16 staticnet
通过docker network ls可以查看网络类型多了一个staticnet
自定义网络模式
自定义网络模式:Docker 还允许创建自定义网络来实现更灵活的网络配置。在自定义网络模式下,可以创建一个独立的网络,并将容器连接到该网络中。这样可以在自定义网络中实现容器之间的通信,同时也可以通过网络的连接方式将容器连接到宿主机网络或其他网络。
Docker-compose
简介
默认的模板文件是docker-compose.yml,其中定义每个服务可以通过image指令指定镜像或build指令(需要docker-build)自动构建。
如果使用build指令,在 Dockerfile
中设置的选项(例如:CMD
, EXPOSE
, VOLUME
, ENV
等) 将会自动被获取,无需在 docker-compose.yml
中再次设置。如果设置了会被YML覆盖
Docker-compose命令
命令 | 描述 |
docker-compose up -d | 构建启动容器 |
docker-compose exec bash | 登录到容器中 |
docker-compose down | 删除所有镜像、容器 |
docker-compose ps | 显示所有容器 |
docker-compose run --nodeps --rm php-fpm php -v | 在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器 |
docker-compose build | 构建镜像 |
docker-compose build --no-cache | 构建镜像,不带缓存 |
docker-compose logs | 查看的日志 |
docker-compose logs-f | 验证文件配置(docker-compose.yml) |
docker-compose pause | 暂停容器 |
docker-compose unpause | 恢复容器 |
docker-compose rm | 删除容器(删除之前必须关闭容器) |
docker-compose stop | 停止容器 |
docker-compose start | 启动容器 |
image:指定镜像名称或者镜像ID,如果镜像不存在,compose将尝试拉取这个镜像
build:指定dockerfile所在的文件夹路径。compose会利用这个路径自动构建并使用
command:覆盖容器后执行的命令
links:连接到其他服务中的容器。使用服务名称或别名格式都可以,亦可在hosts文件中创建
external_links:链接到docker-compose.yml的外部容器,???
ports:暴露端口信息。Host:Container
expose:暴露端口,但不映射到宿主机,只被链接的服务访问。可以指定内部端口参数
volums:卷挂载路径设置。可以设置宿主机的路径Host:Container
volumes_from:从另一个服务或容器挂载他的所有卷
environment:设置环境变量。
networks:用于设置指定网络,子标签用于设置别名,相同的别名可以在不同的网络中拥有不同的别名
Docker-compose网络
随着微服务的事件,应用的越来越多, 经常会碰到需要多个容器共同协作, 这样就需要多个容器之间能够互相访问。Docker提供了映射容器端口到宿主机和容器互联机制来为容器提供网络服务。随着 docker 的快速发展,其网络架构也在不断的演进。
为了标准化网络驱动的开发步骤和支持多种网络驱动,docker 公司在 libnetwork 中使用了 CNM(Container Network Model)。CNM 定义了构建容器虚拟化网络的模型,同时还提供了可以用于开发多种网络驱动的标准化接口和组件
CNM的理念是提供可以跨不同网络基础架构可实现移植的应用。这个模型平衡了应用的可移植性同时不会损失基础架构原有的各种特性和功能。
CNM的组成
沙箱(SandBox)--一个沙箱包含了容器的网络配置。这里包括了容器接口的管理,路由表,和DNS设定。一个沙箱可以包含多个来自不同网络的端点,可以同时连接多个网络。
端点(Endpoint)--沙箱通过端点来连接网络。端点结构的存在使到应用与网络的连接实现虚拟化。这样有助于维护应用的可移值性,因此一个服务可以在无须知道如何去连接网络的情况下使用不同类型的网络驱动。
网络(Network)--CNM并不是OSI模型中说的网络层。而是由Linux桥接,VLan等来实现。网络收集了所有连接在其上的端点,并实现了这些端点的互连。端点如果不连接到其中一个网络,那么将无法与外界连接。
CNM驱动接口
容器连网模型提供了两个可拔插且开放的接口供用户使用,这些接口是用于通讯,利用供应商提供的附加功能,网络可见性,或网络控制等方面。目前存在以下网络驱动:
网络驱动(Network Drivers)--Docker网络驱动提供了使网络可以工作的具体实现。他们是可拔插的,所以很易于支持不同的用户使用场景。多个网络驱动可同时用于指定的Docker引擎和群集。有以下两个广泛使用的CNM网络驱动:
内置网络驱动(Native Network Drivers)--内置网络驱动是内置于Docker引擎,并随Docker提供的驱动。有多个驱动可供选择,以支持不同的功能,如overlay网络和local bridge网络。
远程网络驱动(Remote Network Drivers)--远程网络驱动是由社区或其它供应商建立的网络驱动。这些驱动可用于与现有的软件或硬件环境进行集成。用户也可以建立自己的网络驱动以达成各种特殊需求。
IPAM(IP地址管理)驱动--Docker有一个内置的IP地址管理驱动,在没有特别指定IP的情况下,它会为网络和端点提供了默认的子网或IP地址。IP地址通过网络(docker network create),容器(docker container create)和服务(docker service create)创建指令来人工分配。远程IPAM驱动也存在和提供了集成到现有IPAM的工具。
CNM内置驱动
Docker内置网络驱动是Docker引擎的一部份不需要任何额外模块。他们可以被docker network命令所调用。以下是现存的内置网络驱动:
驱动 | 描述 |
---|---|
Host | 没有命名空间隔离,主机上的所有接口都可以直接被容器使用。 |
Bridge | 受Docker管理的Linux桥接网络。默认在同一个bridge网络的容器都可以相互通迅。 容器的外部访问也可以使用bridge驱动来设置。 |
Overlay | 提供多主机的容器网络互连。同时使用了本地Linux桥接网络和VXLAN技术实现容器之间跨物理网络架构的连接。 |
MACVLAN | 使用MACVLAN桥接模式建立容器接口和主机接口之间的连接。实现为容器提供在物理网络中可路由的IP地址。 此外VLAN可以被中继至macvlan驱动以强制实现容器的2层分段。 |
None | 容器具有属于自己的网络栈和网络命名空间,但并在容器内添加网络接口。如没有其它的设置,则容器将完全独立于其它网络。 |