Docker是一个开源的容器引擎,它有助于更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可以缩短从编写到部署运行代码的周期。
开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。
Docker 的核心理念是 Build, Ship, and Run Any App, Anywher,即一次封装,到处运行。
容器(Container)
①Docker利用容器独立运行的一个或一组应用。容器是用镜像创建的运行实例。它可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。
②可以把容器看作是一个简易版的Linux环境(包括root用户权限、进程空间、用户空间和网络空间等)和运行在其中的应用程序。
③容器的定义和镜像几乎一摸一样,也是一堆层的统一视角,唯一区别在于容器的最上面那一层是可读可写的。
仓库(Repository)
①是集中存放镜像文件的场所。
②仓库和仓库注册服务器(Registry)是有区别的。仓库注册服务器上往往存放着多个仓库,每个仓库中又包含多个镜像,每个镜像有不同德标签(tag)。
③仓库分为公开仓库(Public)和私有仓库(Private)两种形式。
④最大的公开仓库是Docker Hub(https://hub.docker.com/),存放了数量庞大的镜像供用户下载。国内的公开仓库包括:阿里云、网易云等。
Docker是一个Client-Server结构的系统,Docker守护进程运行在主机上,然后通过Socket连接从客户端访问,守护进程从客户端接收命令并管理运行在主机上的容器。容器:是一个运行时环境。
docker有着比虚拟机更少的抽象层。由于docker不需要Hypervisor实现硬件资源虚拟化,运行在docker容器上的程序直接使用的都是实际物理机的硬件资源。因此在CPU、内存利用率上docker将会在效率上有明显优势。
docker利用的是宿主主机的内核,而不需要Guest OS。因此,当新建一个容器时,docker不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核等比较费时费资源的过程,当新建一个虚拟机软件需要加载Guest OS,新建过程是分钟级别的。而docker由于直接利用宿主机的操作系统,则省略了该过程,因此新建一个docker容器只需要几分钟。
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum -y install docker-ce
登录阿里云官网,按下图流程来获取自己的加速器地址,并在服务器配置。
重启docker的守护进程
systemctl daemon-reload
重启docker服务
systemctl restart docker
验证加速成功,执行docker info 命令,查看Registry Mirrors为刚才配置的加速器地址。
[root@localhost docker]# docker info
Registry Mirrors:
https://********.mirror.aliyuncs.com/
Live Restore Enabled: false
systemctl enable docker
docker version :版本信息
docker info:docker信息
docker --help:帮助命令
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
jenkinsci/blueocean latest 9393ec9589f7 2 weeks ago 568MB
REPOSITORY:表示镜像的仓库源。
TAG:镜像的标签(版本)
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小
docker search redis
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
redis Redis is an open source key-value store that… 8230 [OK]
bitnami/redis Bitnami Redis Docker Image 145 [OK]
...
docker start [容器ID或者容器名]:启动容器
docker stop 容器id:停止容器
docker kill 容器id:强制停止容器
docker start 容器id:启动已停止的容器
docker inspect 容器id:查看容器的所有信息
docker container logs 容器id:查看容器日志
docker logs 【容器名称】:查看容器日志
docker top 容器id:查看容器里的进程
docker rm 容器id:删除已停止的容器
docker rm -f 容器id:删除正在运行的容器
docker rm -f $(docker ps -d)
docker container prune:删除所有已经退出的容器
docker exec -it 容器id /bin/bash:进入容器
exit:容器停止退出
ctrl+P+Q:容器不停止退出
docker cp 宿主机文件路径 容器ID或名称:容器路径:宿主机文件拷贝到容器中
docker cp 容器ID或名称:容器路径 宿主机文件路径:容器文件拷贝到宿主机中
用来构建Docker镜像的文件,是由一系列命令和参数构成的脚本。涉及的内容包括执行代码或是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程等。
Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。
Docker-Compose将所管理的容器分为三层,分别是工程(project),服务(service)以及容器(container)。
Docker-Compose运行目录下的所有文件(docker-compose.yml,extends文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像,参数,依赖。一个服务当中可包括多个容器实例,Docker-Compose并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡。
Docker-Compose的工程配置文件默认为docker-compose.yml,可通过环境变量COMPOSE_FILE或-f参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个Dockerfile模板文件,可以让用户很方便的定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。
Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker-Compose项目由Python编写,调用Docker服务提供的API来对容器进行管理。因此,只要所操作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。
docker-compose-Linux-v1.25.5
下载解压后上传到宿主机/usr/local/bin/目录下,
重命名
mv docker-compose-Linux-x86_64 docker-compose
授予可执行权限
chmod +x docker-compose
查看版本,验证安装成功
docker-compose -v
Compose允许用户通过一个docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Compose模板文件是一个定义服务、网络和卷的YAML文件。Compose模板文件默认路径是当前目录下的docker-compose.yml,可以使用.yml或.yaml作为文件扩展名。
Docker-Compose标准模板文件应该包含version、services、networks 三大部分,最关键的是services和networks两个部分。
#Compose目前有三个版本分别为Version 1,Version 2,Version 3,Compose区分Version 1和Version 2(Compose 1.6.0+,Docker Engine 1.10.0+)。Version 2支持更多的指令。Version 1将来会被弃用。
version: "3"
services:
# 服务名称
redis-master:
# 服务的镜像名称或镜像ID。如果镜像在本地不存在,Compose将会尝试拉取镜像。
image: redis
# 创建的容器名称
container_name: redis-master
# 自启动
restart: always
# container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。
privileged: true
# 为容器设置环境变量:
environment:
- TZ=Asia/Shanghai
# 端口映射,格式为宿主机端口:容器内部端口
ports:
- "6379:6379"
# 挂载数据卷,用于宿主机和容器共享文件,格式为宿主机目录:容器内部目录
volumes:
- /zimo/redis/masterData:/data
- /zimo/redis/conf/redis-master.conf:/usr/local/etc/redis/redis.conf
# 覆盖容器启动后默认执行的命令。
command: redis-server /usr/local/etc/redis/redis.conf
redis-sentinel:
image: redis
container_name: redis-sentinel
restart: always
privileged: true
environment:
- TZ=Asia/Shanghai
ports:
- "26379:26379"
volumes:
- /zimo/redis/conf/redis-sentinel.conf:/usr/local/etc/redis/sentinel.conf
command: redis-sentinel /usr/local/etc/redis/sentinel.conf
docker-compose命令必须在对应的docker-compose.yml同级目录中执行
[root@localhost docker-registry]# vi docker-compose.yml
version: '3'
services:
registry:
image: registry
container_name: docker-registry
privileged: true
restart: always
ports:
- "5000:5000"
environment:
- REGISTRY_AUTH=htpasswd
- REGISTRY_AUTH_HTPASSWD_REALM=Registry_Realm
- REGISTRY_AUTH_HTPASSWD_PATH=./auth/htpasswd
volumes:
- ./registry:/var/lib/registry
- ./auth:/auth
registry-ui:
image: konradkleine/docker-registry-frontend:v2
container_name: docker_registry_ui
restart: always
privileged: true
environment:
- ENV_DOCKER_REGISTRY_HOST=192.168.1.234
- ENV_DOCKER_REGISTRY_PORT=5000
ports:
- "5001:80"
[root@localhost docker-registry]# docker-compose up -d
Creating network "docker-registry_default" with the default driver
Pulling registry (registry:)...
Trying to pull repository docker.io/library/registry ...
latest: Pulling from docker.io/library/registry
486039affc0a: Pull complete
ba51a3b098e6: Pull complete
8bb4c43d6c8e: Pull complete
6f5f453e5f2d: Pull complete
42bc10b72f42: Pull complete
Digest: sha256:7d081088e4bfd632a88e3f3bcd9e007ef44a796fddfe3261407a3f9f04abe1e7
Status: Downloaded newer image for docker.io/registry:latest
Pulling registry-ui (konradkleine/docker-registry-frontend:v2)...
Trying to pull repository docker.io/konradkleine/docker-registry-frontend ...
v2: Pulling from docker.io/konradkleine/docker-registry-frontend
...
管理界面: http://192.168.1.234:5001/home
点击Browse repositories,提示需要用户名和密码。
进入auth目录,将用户名和密码写入htppasswd文件
[root@localhost auth]# docker run --entrypoint htpasswd registry -Bbn admin admin >> /data/docker-registry/auth/htpasswd
[root@localhost auth]# cat htpasswd
admin:$2y$05$eQQNyF7t11tllqgLcNcwZuu/lrjeCFpkys4FfA9HGrFhHGlPlgKnK
重启容器后再次尝试登录。
registry-mirrors:公共仓库。
insecure-registries:私有仓库。
[root@localhost docker]# vi /etc/docker/daemon.json
{
"registry-mirrors": ["https://******.mirror.aliyuncs.com"],
"insecure-registries":["192.168.1.234:5000"]
}
#重启服务
systemctl restart docker
登录
若报错:http: server gave HTTP response to HTTPS client时请检查本地docker的daemon.json中配置的私有仓库地址是否正确。
[root@localhost docker]# docker login 192.168.1.234:5000
Username: admin
Password:
Login Succeeded
标记本地镜像
docker tag 镜像名 私有仓库IP:端口/镜像名:版本
[root@localhost docker]# docker tag hello-world 192.168.1.234:5000/hello-world
push images
docker push 私有仓库IP:端口/镜像名:版本
[root@localhost docker]# docker push 192.168.1.234:5000/hello-world
The push refers to a repository [192.168.1.234:5000/hello-world]
9c27e219663c: Pushed
latest: digest: sha256:90659bf80b44ce6be8234e6ff90a1ac34acbeb826903b02cfa0da11c82cbc042 size: 525