Docker是一个开源的引擎,可以轻松的为任何应用创建一个轻量级的、可移植的、自给自足的容器。开发者在笔记本上编译测试通过的容器可以批量地在生产环境中部署,包括VMs(虚拟机)、 bare metal、OpenStack 集群和其他的基础应用平台。 主要基于 Go 语言开发 并遵从Apache2.0协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
它采用了虚拟操作系统技术。它是一个守护进程,通过BAST JPA接口对接命令行,使用docker的命令行操作docker容器。
Docker的主要模块有镜像、容器、网络、数据卷。一般的vm虚拟机上是不能再装vm的,但docker可以装docker,它通过镜像封装docker容器,通过数据卷实现原生的内存使用,达到最小的内存消耗。
更高效的利用系统资源
由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高。无论是应用执行速度、内存损耗或者文件存储速度,都要比传统虚拟机技术更高效。因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用。
更快速的启动时间
传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 「这段代码在我机器上没问题啊」 这类问题。
持续交付和部署
对开发和运维(DevOps)人员来说,最希望的就是一次创建或配置,可以在任意地方正常运行。
使用 Docker 可以通过定制应用镜像来实现持续集成、持续交付、部署。开发人员可以通过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系统进行集成测试,而运维人员则可以直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。
而且使用 Dockerfile 使镜像构建透明化,不仅仅开发团队可以理解应用运行环境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移
由于 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 可以在很多平台上运行,无论是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运行结果是一致的。因此用户可以很轻易的将在一个平台上运行的应用,迁移到另一个平台上,而不用担心运行环境的变化导致应用无法正常运行的情况。
更轻松的维护和扩展
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。此外,Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 一般为 MB | 一般为 GB |
性能 | 接近原生 | 弱于 |
系统支持量 | 单机支持上千个容器 | 一般几十个 |
镜像(Image)
容器(Container)
仓库(Repository)
Docker作为一个引擎,它的主要构成为server、REST API、CLI三部分。
Docker作为一个客户端服务应用程序(C/S),是一个Paas(平台即服务)的容器化引擎,是利用LXC来实现类似VM的功能,从而利用更加节省的硬件资源提供给用户更多的计算资源的守护进程。
Docker提供了REST风格的API,封装了Docker的内部实现,提供了对外的接口。
Docker提供了CLI命令行工具,方便我们更容易的上手。
Docker的核心共分为四部分:image(镜像)、container(容器)、network(网络)、datavolumes(数据卷)。
首先,容器和镜像的关系可以理解为类和对象的关系,我们创建一个类(镜像)只是提供了功能,但并不能直接使用类。所以,想要使用这个类,就要去实例化类,也就是创建对象(容器)。
Docker | 面向对象 |
---|---|
容器 | 对象 |
镜像 | 类 |
其次,Docker的拉取前提是基于网络,而Docker中的一大特色便是它的数据卷。一般的服务我们在需要集群的时候,例如两台Tomcat服务,就需要去修改它的配置文件,但每次去做修改或者下载两个Tomcat是一种很不可取的行为。而我们拉取的Docker镜像在需要这种情况时,则可以通过配置数据卷,先加载数据卷再运行容器达到集群。
参考文章:千峰教育 - Docker 菜鸟教程 - Docker
推荐网站:Docker中文社区
前提条件:Docker 要求 Ubuntu 系统的内核版本高于 3.10
uname -r
更换国内软件源,推荐中国科技大学的源,稳定速度快(可选)
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
sudo sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/ apt/sources.list
sudo apt update
安装需要的包
sudo apt install apt-transport-https ca-certificates software-properties-common curl
添加 GPG 密钥,并添加 Docker-ce 软件源,中国科技大学和阿里二选一
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
中国科技大学
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
阿里
sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce
sudo systemctl enable docker
sudo systemctl start docker
sudo docker run hello-world
sudo groupadd docker
sudo usermod -aG docker $USER
其他Ubuntu安装请参考:菜鸟教程 - Ubuntu Docker 安装
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-selinux \
docker-engine-selinux \
docker-engine
查看内核版本
uname -r
安装一些必要的系统工具:
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
添加软件源信息:
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新 yum 缓存:
sudo yum makecache fast
安装 Docker-ce:
sudo yum -y install docker-ce
启动 Docker 后台服务
sudo systemctl start docker
测试运行 hello-world(可忽略)
docker run hello-world
使用 sudo 或 root 权限登录 Centos。
确保 yum 包更新到最新。
sudo yum update
执行 Docker 安装脚本。
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
执行这个脚本会添加 docker.repo 源并安装 Docker。
启动 Docker 进程。
sudo systemctl start docker
验证 docker 是否安装成功并在容器中执行一个测试的镜像。(可忽略)
sudo docker run hello-world
docker ps
其他ContOS安装请参考:菜鸟教程 - CentOS Docker 安装
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,例如网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
二选一,也可以百度自己找更快的。
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}
{
"registry-mirrors": ["http://registry.docker-cn.com"]
}
systemctl enable docker
Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
usermod -aG docker 你的用户名
sudo yum remove docker-ce
sudo rm -rf /var/lib/docker
查看镜像版本
docker search 镜像名称(如oracle)
拉取镜像
docker pull 镜像名称(如oracle):版本号
运行容器
docker run --name 别名 -d -p 映射端口:容器端口 容器名称
停止容器
sudo docker stop 容器名/容器ID
查看容器列表
sudo docker images
查看运行容器列表
sudo docker ps
sudo docker ps -a
启动容器和重启容器
sudo docker start 容器ID
sudo docker restart 容器ID
进入一个已经在运行的容器
sudo docker exec -it 容器ID /bin/bash
设置容器开机启动
sudo docker update --restart=always 容器ID
删除运行容器和拉取容器
docker rm 容器ID
docker rmi -f 容器ID
导入容器
cat 文件(如centos.tar) | docker import - 镜像名(如my/centos:v1)
镜像保存/载入:docker load/docker save
容器导入/导出:docker import/docker export
DockerCompose运行基于yml脚本文件,需要在docker-compose.yml(没有自己创建一个)所在目录使用DockerCompose命令
Docker Compose 是 Docker 官方编排(Orchestration)项目之一,负责快速的部署分布式应用。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker Compose 与 Docker Stack 非常类似。它能够在 Docker 节点上,以单引擎模式(Single-Engine Mode)进行多容器应用的部署和管理。
Docker Compose是一个用来定义和运行复杂应用的Docker工具。一个使用Docker容器的应用,通常由多个容器组成。使用Docker Compose不再需要使用shell脚本来启动容器。
Compose 通过一个配置文件来管理多个Docker容器,在配置文件中,所有的容器通过services来定义,然后使用docker-compose脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
compose文件格式版本 | docker版本 |
---|---|
3.4 | 17.09.0+ |
3.3 | 17.06.0+ |
3.2 | 17.04.0+ |
3.1 | 1.13.1+ |
3.0 | 1.13.0+ |
2.3 | 17.06.0+ |
2.2 | 1.13.0+ |
2.1 | 1.12.0+ |
2.0 | 1.10.0+ |
1.0 | 1.9.1.+ |
从github上下载docker-compose二进制文件安装,下载最新版的docker-compose文件
sudo curl -L https://github.com/docker/compose/releases/download/1.16.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
添加可执行权限
sudo chmod +x /usr/local/bin/docker-compose
查看版本,测试安装是否成功
docker-compose version
pip安装
sudo pip install docker-compose
或者
yum -y install epel-release
yum -y install python-pip
确认pip版本
pip --version
更新pip
pip install --upgrade pip
sudo rm /usr/local/bin/docker-compose
sudo pip uninstall docker-compose
启动
docker-compose up
关闭
docker-compose down
查看运行列表
docker-compose ps
停止/运行/容器
docker-compose stop
docker-compose start
docker-compose restart
日志
docker-compose logs
拉取容器
docker-compose pull
移除容器
docker-compose rm
version: "3"
services:
webapp:
image: examples/web
ports:
- "80:80"
volumes:
- "/data"
参考文章:千锋教育 - Docker 三剑客 Compose
常用命令推荐文章:Docker快速入门——Docker-Compose
准备工作
配置文件
version: '3'
services:
gitlab-ce-zh:
image: 'twang2218/gitlab-ce-zh'
restart: always
hostname: '192.168.1.133'
environment:
TZ: 'Asia/Shanghai'
GITLAB_OMNIBUS_CONFIG: |
external_url 'http://192.168.1.133:8080'
gitlab_rails['time_zone'] = 'Asia/Shanghai'
gitlab_rails['gitlab_shell_ssh_port'] = 22
unicorn['port'] = 8888
nginx['listen_port'] = 8080
ports:
- '8080:8080'
- '8443:443'
- '2222:22'
volumes:
- /usr/local/docker/gitlab/config:/etc/gitlab
- /usr/local/docker/gitlab/data:/var/opt/gitlab
- /usr/local/docker/gitlab/logs:/var/log/gitlab
启动gitlab
docker-compose up -d
SSH免密登录
CMD运行生成秘钥:ssh-keygen -t rsa -C 邮箱
生成公钥配置到gitlab上,使用SSH方式拉去项目即可
准备工作
配置文件
version: '3.1'
services:
nexus3:
image: 'shifudao/nexus3'
restart: always
container_name: 'nexus3'
ports:
- '8081:8081'
volumes:
- /usr/local/docker/nexus3/data:/nexus-data
启动gitlab
docker-compose up -d
准备工作
配置文件
version: '3.1'
services:
nexus3:
image: 'registry'
restart: always
container_name: 'registry'
ports:
- '5000:5000'
volumes:
- /usr/local/docker/registry/data:/var/lib/registry
frontend:
image: konradkleine/docker-registry-frontend:v2
ports:
- 8080:80
volumes:
- ./certs/frontend.crt:/etc/apache2/server.crt:ro
- ./certs/frontend.key:/etc/apache2/server.key:ro
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.1.3
- ENV_DOCKER_REGISTRY_PORT=5000
启动gitlab
docker-compose up -d
配置私服通知(Deploy客户端配置)
添加到加速器路径 etc/docker/daemon.json中
“insecure-registries”:[“ip:5000”]
Registry查看地址
Ip:端口/v2/
Ip:端口/v2/_catalog
Ip:端口/v2/镜像/tags/list
配置拉取地址(Deploy客户端配置)
拉去镜像:docker pull tomcat
配置地址:docker tag tomcat ip:5000/tomcat
上传镜像:docker push ip:5000/tomcat
version: '3'
services:
docker_jenkins:
restart: always
image: jenkins/jenkins:lts
container_name: docker_jenkins
ports:
- '8080:8080'
- '50000:50000'
volumes:
- ./data/:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
- /usr/lib/x86_64-linux-gnu/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7
其他推荐Docker教程:C语言中文网 - Docker
以上便是所有的Docker总结了,如果有不对的地方或者需要补充的地方欢迎大家留言。