Docker容器技术于2013年做为开源Docker引擎推出。是一个开源的应用容器引擎,基于 Go 语言并听从Apache2.0协议开源。基于 Linux 内置的 Namespace 和 CGroup 等系统内隔离机制而抽象出来的一种轻虚拟化技术。php
l 更快速的交付和部署:html
对开发和运维人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行 ,解决开发环境和生产环境不一致的问题。mysql
l 更轻松的迁移和扩展:linux
Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。 这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。nginx
l 更高的资源利用率(微服务)git
Docker 对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器github
1.单项目打包web
每次部署项目到测试、生产等环境,都要部署一大堆依赖的软件、工具,并且部署期间出现问题概率很大,不经意就花费了很长时间。redis
Docker主要理念就是环境打包部署,可在任意DockerEngine运行。前期咱们只须要将每一个项目环境打包到镜像,push到镜像仓库,当有须要部署这个项目时,直接pull镜像启动容器,这个项目就能够访问了!一次构建屡次部署,一劳永逸。sql
2.整套项目打包
有一个产品能够整套部署到客户那里,以往都是派一名实施工程师到客户那部署。若是用了Docker,咱们能够前期将这套项目封装打包起来,实现一键部署,分分钟钟搞定,就不须要再派人过去了。好比官方的DockerCompose编排工具。
3.新开源技术试用
直接从公共镜像仓库pull项目官方作好镜像启动容器
Docker将项目环境打包成镜像,能够在任何DockerEngine上浪。此时Docker就是咱们这些项目的基石,Docker可移植性,保持运行状态一致性
一个项目版本快速迭代的测试场景,须要一个合理的CI(持续集成)/CD(持续部署)环境支撑。CI/CD是一个周期性自动化项目测试流程,包括构建、部署、测试、发布等工做,不多须要人工干预。
尽量细粒度拆分业务程序架构,由多个独立服务组成业务系统。一个容器一个服务,容器之间相互隔离
容器集群化管理已经有成熟的解决方案,好比:官方的Swarm,谷歌的K8S
虚拟机(Virtual Machine)指经过软件模拟的具备完整硬件系统功能的、运行在一个彻底隔离环境中的完整计算机系统。在实体计算机中可以完成的工做在虚拟机中都可以实现。在计算机中建立虚拟机时,须要将实体机的部分硬盘和内存容量做为虚拟机的硬盘和内存容量。每一个虚拟机都有独立的CMOS、硬盘和操做系统,能够像使用实体机同样对虚拟机进行操做。
Vm管理系统 Hyper-V、Xen以及KVM
https://docs.microsoft.com/zh...
Docker架构设计图
镜像(Image)
Docker 镜像(Image)就是一个只读的模板。例如:一个镜像能够包含一个完整的操做系统环境,里面仅安装了 Apache 或用户须要的其它应用程序。镜像能够用来建立 Docker 容器,一个镜像能够建立不少容器。Docker 提供了一个很简单的机制来建立镜像或者更新现有的镜像,用户甚至能够直接从其余人那里下载一个已经作好的镜像来直接使用。
容器(Container)
Docker 利用容器(Container)来运行应用。容器是从镜像建立的运行实例。它能够被启动、开始、中止、删除。每一个容器都是相互隔离的。
文件系统隔离技术使得Docker成为了一个很是有潜力的虚拟化技术。在容器中能够对文件进行修改、删除、建立。
仓库(Registry)
仓库(Repository)是集中存放镜像文件的场所。仓库分为公开仓库(Public)和私有仓库(Private)两种形式。最大的公开仓库是 Docker Hub,存放了数量庞大的镜像供用户下载。
官方仓库地址:https://hub.docker.com
https://docs.docker.com/docke...
systemctl stop firewalld
获取selinux状态
[root@instance-xkxy07le ~]# getenforce Disabled
关闭selinux
vim /etc/selinux/config SELINUX=disabled
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
[root@instance-xkxy07le ~]# yum list docker-ce --showduplicates | sort -r Loaded plugins: langpacks, versionlock Installed Packages Excluding 1 update due to versionlock (use "yum versionlock status" to show it) docker-ce.x86_64 3:19.03.4-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.4-3.el7 @docker-ce-stable docker-ce.x86_64 3:19.03.3-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.2-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.1-3.el7 docker-ce-stable docker-ce.x86_64 3:19.03.0-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.9-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.8-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.7-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.6-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.5-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.4-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.3-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.2-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.1-3.el7 docker-ce-stable docker-ce.x86_64 3:18.09.0-3.el7 docker-ce-stable docker-ce.x86_64 18.06.3.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.2.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.1.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.06.0.ce-3.el7 docker-ce-stable docker-ce.x86_64 18.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 18.03.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.12.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.09.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.06.0.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.3.ce-1.el7 docker-ce-stable docker-ce.x86_64 17.03.2.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.1.ce-1.el7.centos docker-ce-stable docker-ce.x86_64 17.03.0.ce-1.el7.centos docker-ce-stable
1. 默认安装最新版本
yum install docker-ce
2. 安装指定版本
yum install docker-ce-3:18.09.5-3.el7
systemctl start docker
https://cr.console.aliyun.com...
[root@instance-xkxy07le ~]# docker container --hlep unknown flag: --hlep See 'docker container --help'. Usage: docker container COMMAND Manage containers Commands: attach Attach local standard input, output, and error streams to a running container commit Create a new image from a container's changes cp Copy files/folders between a container and the local filesystem create Create a new container diff Inspect changes to files or directories on a container's filesystem exec Run a command in a running container export Export a container's filesystem as a tar archive inspect Display detailed information on one or more containers kill Kill one or more running containers logs Fetch the logs of a container ls List containers pause Pause all processes within one or more containers port List port mappings or a specific mapping for the container prune Remove all stopped containers rename Rename a container restart Restart one or more containers rm Remove one or more containers run Run a command in a new container start Start one or more stopped containers stats Display a live stream of container(s) resource usage statistics stop Stop one or more running containers top Display the running processes of a container unpause Unpause all processes within one or more containers update Update configuration of one or more containers wait Block until one or more containers stop, then print their exit codes Run 'docker container COMMAND --help' for more information on a command.
docker search redis
docker pull redis
docker image ls REPOSITORY TAG IMAGE ID CREATED SIZE redis latest de25a81a5a0b 2 weeks ago 98.2MB
docker image rm redis
docker image save de25a81a5a0b -o redis.tar
docker image load -i redis.tar
docker image tag IMAGEID REPOSITORY:VERSION
docker image prune
docker image build
docker inspect
[root@instance-xkxy07le ~]# docker image --help Usage: docker image COMMAND Manage images Commands: build Build an image from a Dockerfile history Show the history of an image import Import the contents from a tarball to create a filesystem image inspect Display detailed information on one or more images load Load an image from a tar archive or STDIN ls List images prune Remove unused images pull Pull an image or a repository from a registry push Push an image or a repository to a registry rm Remove one or more images save Save one or more images to a tar archive (streamed to STDOUT by default) tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGE
[root@instance-xkxy07le ~]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 54e39c3af532 redis:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp amazing_sinoussi docker container ps
-a :显示全部的容器,包括未运行的。
-f :根据条件过滤显示的内容。
--format :指定返回值的模板文件。
-l :显示最近建立的容器。
-n :列出最近建立的n个容器。
--no-trunc :不截断输出。
-q :静默模式,只显示容器编号。
-s :显示总的文件大小。
输出详情介绍:
CONTAINER ID:容器 ID。
IMAGE:使用的镜像。
COMMAND:启动容器时运行的命令。
CREATED:容器的建立时间。
STATUS:容器状态。
状态有7种:
1.created(已建立)
2.restarting(重启中)
3.running(运行中)
4.removing(迁移中)
5.paused(暂停)
6.exited(中止)
7.dead(死亡)
[root@instance-xkxy07le ~]# docker run -p 6379:6379 -d redis:latest redis-server 54e39c3af532dc183204381a86f41ae3b7f18c754a8d5abae1f911aa83b92cea
-d, --detach=false, 指定容器运行于前台仍是后台,默认为false
-i, --interactive=false, 打开STDIN,用于控制台交互
-t, --tty=false, 分配tty设备,该能够支持终端登陆,默认为false
-u, --user="", 指定容器的用户
-a, --attach=[], 登陆容器(必须是以docker run -d启动的容器)
-w, --workdir="", 指定容器的工做目录
-c, --cpu-shares=0, 设置容器CPU权重,在CPU共享场景使用
-e, --env=[], 指定环境变量,容器中可使用该环境变量
-m, --memory="", 指定容器的内存上限
-P, --publish-all=false, 指定容器暴露的端口
-p, --publish=[], 指定容器暴露的端口
-h, --hostname="", 指定容器的主机名
-v, --volume=[], 给容器挂载存储卷,挂载到容器的某个目录
--volumes-from=[], 给容器挂载其余容器上的卷,挂载到容器的某个目录
--cap-add=[], 添加权限,权限清单详见: https://linux.die.net/man/7/c...
--cap-drop=[], 删除权限,权限清单详见: https://linux.die.net/man/7/c...
--cidfile="", 运行容器后,在指定文件中写入容器PID值,一种典型的监控系统用法
--cpuset="", 设置容器可使用哪些CPU,此参数能够用来容器独占CPU
--device=[], 添加主机设备给容器,至关于设备直通
--dns=[], 指定容器的dns服务器
--dns-search=[], 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
--entrypoint="", 覆盖image的入口点
--env-file=[], 指定环境变量文件,文件格式为每行一个环境变量
--expose=[], 指定容器暴露的端口,即修改镜像的暴露端口
--link=[], 指定容器间的关联,使用其余容器的IP、env等信息
--lxc-conf=[], 指定容器的配置文件,只有在指定--exec-driver=lxc时使用
--name="", 指定容器名字,后续能够经过名字进行容器管理,links特性须要使用名字
--net="bridge", 容器网络设置:
1.bridge 使用docker daemon指定的网桥
2.host //容器使用主机的网络
3.container:NAME_or_ID >//使用其余容器的网路,共享IP和PORT等网络资源
4.none 容器使用本身的网络(相似--net=bridge),可是不进行配置
--privileged=false, 指定容器是否为特权容器,特权容器拥有全部的capabilities
--restart="no", 指定容器中止后的重启策略:
1.no:容器退出时不重启
2.on-failure:容器故障退出(返回值非零)时重启
3.always:容器退出时老是重启
--rm=false, 指定容器中止后自动删除容器(不支持以docker run -d启动的容器)
--sig-proxy=true, 设置由代理接受并处理信号,可是SIGCHLD、SIGSTOP和SIGKILL不能被代理
[root@instance-xkxy07le ~]# docker exec -it 容器名/容器id /bin/bash root@54e39c3af532:/data# hostname 54e39c3af532
docker logs 容器名
docker stats 容器名
--no-stream
docker inspect 容器名/容器id
docker cp php.ini 容器名/容器id:/
docker top 容器名/容器
docker stop/start/restart 容器名/容器
docker rm 容器名/容器
docker rm -f $(docker ps -a | awk '{print $1}')
docker update 容器名/容器
–blkio-weight Block IO (relative weight), between 10 and 1000, or 0 to disable (default 0)
–cpu-period Limit CPU CFS (Completely Fair Scheduler) period
–cpu-quota Limit CPU CFS (Completely Fair Scheduler) quota
–cpu-rt-period Limit the CPU real-time period in microseconds
–cpu-rt-runtime ALimit the CPU real-time runtime in microseconds
–cpu-shares , -c CPU shares (relative weight)
–cpus Number of CPUs
–cpuset-cpus CPUs in which to allow execution (0-3, 0,1)
–cpuset-mems MEMs in which to allow execution (0-3, 0,1)
–kernel-memory Kernel memory limit
–memory , -m Memory limit
–memory-reservation Memory soft limit
–memory-swap Swap limit equal to memory plus swap: ‘-1’ to enable unlimited swap
–restart Restart policy to apply when a container exits
将宿主机目录挂载到容器目录。
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,能够提供不少有用的特性:
数据卷 能够在容器之间共享和重用
对 数据卷 的修改会立马生效
对 数据卷 的更新,不会影响镜像
数据卷 默认会一直存在,即便容器被删除
[root@instance-xkxy07le ~]# docker volume Usage: docker volume COMMAND Manage volumes Commands: create Create a volume inspect Display detailed information on one or more volumes ls List volumes prune Remove all unused local volumes rm Remove one or more volumes Run 'docker volume COMMAND --help' for more information on a command.
docker volume create my-vol
docker volume ls
docker volume inspect my-vol
docker volume rm my-vol
docker volume prune
docker inspect web
docker run -d --name nginxweb -p 80:80 -v /home/www:/usr/share/nginx/html nginx
容器不会得到一个独立的network namespace,而是与宿主机共用一个
获取独立的network namespace,但不为容器进行任何网络配置。
与指定的容器使用同一个network namespace,网卡配置也都是相同的。
自定义网桥,默认与bridge网络同样。
先建立一个docker0的网桥,使用veth pair建立一对虚拟网卡,一端放到新建立的容器中,并重命名eth0,另外一端放到宿主机上,以veth+随机7个字符串命名,并将这个网络设备加入到docker0网桥中,网桥自动为容器分配一个IP,并设置docker0的IP为容器默认网关。因此容器默认网络都加入了这个网桥,所以均可以彼此通讯。同时在iptables添加SNAT转换网络段IP,以便容器访问外网。
Linux IP信息包过滤原理
Docker主要经过netfilter/iptables实现网络通讯。iptables由netfilter和iptables组成,netfilter组件是Linux内核集成的信息包过滤系统,它维护一个信息包过滤表,这个表用于控制信息包过滤处理的规则集。而iptables只是一个在用户空间的工具,用于增删改查这个过滤表的规则。
容器访问外部
iptables -t nat -nL
外部访问容器
iptables -t nat -nL
临时生效:
# 网桥名称 br_name=br0 # 添加网桥 brctl addbr $br_name # 给网桥设置IP ip addr add 192.168.1.120/24 dev $br_name # 删除已存在的eth0网卡配置 ip addr del 192.168.1.120/24 dev eth0 # 激活网桥 ip link set $br_name up # 添加eth0到网桥 brctl addif $br_name eth0 还须要在Docker启动时桥接这个网桥: vi /etc/default/docker DOCKER_OPTS="-b=br0" service docker restart
永久生效
# vi /etc/network/interfaces auto eth0 iface eth0 inet static auto br0 iface br0 inet static address 192.168.1.120 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 192.168.1.1 bridge_ports eth0
C_ID=$(docker run -itd --net=none ubuntu) C_PID=$(docker inspect -f '{{.State.Pid}}' $C_ID) # 建立network namespace目录并将容器的network namespace软链接到此目录,以便ip netns命令读取 mkdir -p /var/run/netns ln -s /proc/$C_PID/ns/net /var/run/netns/$C_PID # 添加虚拟网卡veth+容器PID,类型是veth pair,名称是vp+容器PID ip link add veth$C_PID type veth peer name vp$C_PID # 添加虚拟网卡到br0网桥 brctl addif br0 veth$C_PID # 激活虚拟网卡 ip link set veth$C_PID up # 设置容器网络信息 IP='192.168.1.123/24' GW='192.168.1.1' # 给进程配置一个network namespace ip link set vp$C_PID netns $C_PID # 在容器进程里面设置网卡信息 ip netns exec $C_PID ip link set dev vp$C_PID name eth0 ip netns exec $C_PID ip link set eth0 up ip netns exec $C_PID ip addr add $IP dev eth0 ip netns exec $C_PID ip route add default via 192.168.1.1
一键脚本
https://github.com/jpetazzo/p...
# docker run -itd --name test01 centos:6 # docker attach test01 /# yum install openssh-server /# passwd root # docker commit test01 centos6_ssh # docker run -itd --name test03 -p 2222:22 centos6_ssh
指令 | 描述 |
---|---|
FROM | 构建的新镜像是基于哪一个镜像 例如:FROM centos:6 |
MAINTAINER | 镜像维护者姓名或邮箱地址 例如:MAINTAINER wangzhiqiang |
RUN | 构建镜像时运行的Shell命令 例如: RUN [“yum”, “install”, “httpd”] RUN yum install httpd |
CMD | 运行容器时执行的Shell命令 例如: CMD [“-c”, “/start.sh”] CMD ["/usr/sbin/sshd", "-D"] CMD /usr/sbin/sshd –D |
EXPOSE | 声明容器运行的服务端口 例如:EXPOSE 80 443 |
ENV | 设置容器内环境变量 例如:ENV MYSQL_ROOT_PASSWORD 123456 |
ADD | 拷贝文件或目录到镜像,若是是URL或压缩包会自动下载或自动解 压 ADD … ADD [“”,… “”] ADD https://xxx.com/html.tar.gz /var/www/html ADD html.tar.gz /var/www/html |
COPY | 拷贝文件或目录到镜像,用法同上 例如:COPY ./start.sh /start.sh |
ENTRYPOINT | 运行容器时执行的Shell命令 例如: ENTRYPOINT [“/bin/bash", “-c", “/start.sh"] ENTRYPOINT /bin/bash -c ‘/start.sh’ |
VOLUME | 指定容器挂载点到宿主机自动生成的目录或其余容器 例如: VOLUME ["/var/lib/mysql"] |
USER | 为RUN、CMD和ENTRYPOINT执行命令指定运行用户 USER [:] or USER [:] 例如:USER wangzhiqiang |
WORKDIR | 为RUN、CMD、ENTRYPOINT、COPY和ADD设置工做目录 例如:WORKDIR /data |
HEALTHCHECK | 健康检查 HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ |
ARG | 在构建镜像时指定一些参数 例如: FROM centos:6 ARG user # ARG user=root USER $user # docker build --build-arg user=wangzhiqiang Dockerfile . |
CMD和ENTRYPOINT指令区别
使用Dockerfile文件构建镜像
Usage: docker build [OPTIONS] PATH | URL | - Options: -t, --tag list # 镜像名称 -f, --file string # 指定Dockerfile文件位置
一、注册帐号 https://hub.docker.com 二、登陆Docker Hub # docker login 或 # docker login --username=lizhenliang --password=123456 三、镜像打标签 # docker tag wordpress:v1 lizhenliang/wordpress:v1 四、上传 # docker push lizhenliang/wordpress:v1 搜索测试: # docker search lizhenliang 五、下载 # docker pull lizhenliang/wordpress:v1
Docker Hub做为Docker默认官方公共镜像;若是想本身搭建私有镜像仓库,官方也提供registry镜像,使得搭建私有仓 库很是简单。
下载registry镜像并启动 # docker pull registry # docker run -d -v /opt/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry 测试,查看镜像仓库中全部镜像 # curl http://192.168.1.120:5000/v2/_catalog {"repositories":[]} 配置私有仓库可信任 # vi /etc/docker/daemon.json {"insecure-registries":["192.168.1.120:5000"]} # service docker restart 打标签 # docker tag centos:6 192.168.1.120:5000/centos:6 上传 # docker push 192.168.1.120:5000/centos:6 下载 # docker pull 192.168.1.120:5000/centos:6 列出镜像标签 # curl http://192.168.1.120:5000/v2/centos/tags/list
本文做者:王志强
若是文章有错误或者建议,请在评论区指出,很是感谢~