一,Docker简介
Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。
Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。
三个基本概念:
仓库(Repository)
镜像(Image)
容器(Container)
1,其中Registry是Docker用于存放镜像文件的仓库,Docker 仓库的概念跟Git 类似。
2,所谓镜像就是构建容器的源代码,是一个只读的模板,由一层一层的文件系统组成的,类似于虚拟机的镜像。
3,那么容器就是由Docker镜像创建的运行实例,类似于虚拟机,容器之间是相互隔离的,包含特定的应用及其所需的依赖文件。
二,Docker安装(centos)
1、Docker要求CentOS系统的内核版本高于 3.10 ,通过 uname -r 命令查看你当前的内核版本是否支持安账docker
uname -r
2、更新yum包:
sudo yum update
3、安装需要的软件包,yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、设置yum源:
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
5、可以查看所有仓库中所有docker版本,并选择特定版本安装:
yum list docker-ce --showduplicates | sort -r
6、安装docker:yum install docker-ce-版本号
sudo yum install docker-ce-19.03.12.ce
7、启动、设置开启开机启动
sudo systemctl start docker
sudo systemctl enable docker
8、验证安装是否成功(有client和service两部分表示docker安装启动都成功了):
docker version
三,Docker常用命令
1,镜像命令
docker image ls // 查看本地镜像
docker rmi id/name // 删除某个镜像
docker build -t app/centos:7.1 . // 通过当前目录下的Dockerfile创建一个名为app/centos:7.1的镜像
docker pull / push 镜像路径url // 拉取 / 推送 镜像,类似git
2,容器命令
docker ps // 查看当前正在运行的容器
docker ps -a // 查看所有容器的状态
docker start/stop id/name // 启动/停止某个容器
docker rm id/name // 删除某个容器
3,交互命令
docker login 镜像仓库地址 // 登录镜像仓库(为了拉取内部镜像和推送权限)
docker attach id // 进入某个容器(使用exit退出后容器也跟着停止运行)
docker exec -ti id // 启动一个伪终端以交互式的方式进入某个容器(使用exit退出后容器不停止运行)
docker run --name test -ti ubuntu /bin/bash 复制ubuntu容器并且重命名为test且运行,然后以伪终端交互式方式进入容器,运行bash
docker run -d -p 2222:22 --name test app/centos:7.1 以镜像app/centos:7.1创建名为test的容器,并以后台模式运行,并做端口映射到宿主机2222端口,P参数重启容器宿主机端口会发生改变
更多命令详解:http://www.docker.org.cn/dockerppt/106.html
4,Dockerfile示例
nginx基础镜像服务生成前端镜像
FROM registry-vpc.cn-shenzhen.aliyuncs.com/cloudpivot/base:nginx-1.19
EXPOSE 80
ADD #APP_NAME#.tar.gz /usr/share/nginx/html/
COPY version.txt /usr/share/nginx/html/
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["nginx"]
CMD ["-g","daemon off;"]
java后端服务镜像
FROM registry-vpc.cn-shenzhen.aliyuncs.com/cloudpivot/base:openjdk-8u265-jdk
WORKDIR /data/cloudpivot/#APP_NAME#
COPY #APP_NAME#.jar /data/cloudpivot/#APP_NAME#/
COPY application.properties /data/cloudpivot/#APP_NAME#/
COPY version.txt /data/cloudpivot/#APP_NAME#/
COPY entrypoint.sh /data/cloudpivot/#APP_NAME#/
ADD skywalking.tar.gz /data/cloudpivot/app-launcher/
EXPOSE 8080
ENV CALL_CHAIN_OPTS=
ENV NACOS_ADDR=nacos:8848
ENV NACOS_NAMESPACE=test
ENV NACOS_CONFIG_ENABLED=true
ENV APP_PORT=8080
ENV TZ=Asia/Shanghai
ENV EXT_ARG=
ENV JAVA_OPTS="-Xms512m -Xmx1024m -Xss256k -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+UseCGroupMemoryLimitForHeap -XX:+HeapDumpOnOutOfMemoryError"
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT /data/cloudpivot/#APP_NAME#/entrypoint.sh #APP_NAME#
四,镜像仓库
仓库(Repository)是集中存放镜像的地方。
目前 Docker 官方维护了一个公共仓库 Docker Hub。
大部分需求都可以通过在 Docker Hub 中直接下载镜像来实现。
1,常用方式
注册
可以在 https://hub.docker.com 免费注册一个 Docker 账号。
登录
$ docker login
搜索
$ docker search nginx
拉取
docker pull nginx
2,harbor私有仓库
Docker容器应用的开发和运行离不开可靠的镜像管理,虽然docker官方提供了公共的镜像仓库(Docker Hub),但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、界面管理、自我注册、镜像复制和中文支持等功能。
(1)基础环境
docker: 19.03.12
docker-compose: 1.26.2
Harbor: v2.1.3
(2)docker安装 (见 二)
docker-compose安装
> curl -L https://github.com/docker/compose/releases/download/1.26.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
> chmod +x /usr/local/bin/docker-compose
> docker-compose version
(3)Harbor私有仓库安装
1、下载Harbor安装文件
# 在线安装包(也可以从 github harbor 官网 release 页面下载指定版本的安装包)
> wget https://github.com/goharbor/harbor/archive/refs/heads/2.1.3.zip
>unzip -qr 2.1.3.zip
2、配置Harbor,进入harbor目录,打开harbor.yml进行配置
# Configuration file of Harbor
# The IP address or hostname to access admin UI and registry service.
# DO NOT use localhost or 127.0.0.1, because Harbor needs to be accessed by external clients.
hostname: harbor.###.cn
# http related config
http:
# port for http, default is 80. If https enabled, this port will redirect to https port
port: 80
# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /usr/local/harbor/ssl/cloudpivot.cn.pem
private_key: /usr/local/harbor/ssl/cloudpivot.cn.key
# 证书配置
# The initial password of Harbor admin
# It only works in first time to install harbor
# Remember Change the admin password from UI after launching Harbor.
harbor_admin_password: Harbor12345
# Harbor DB configuration
database:
# The password for the root user of Harbor DB. Change this before any production use.
password: root123
# The maximum number of connections in the idle connection pool. If it <=0, no idle connections are retained.
max_idle_conns: 50
# The maximum number of open connections to the database. If it <= 0, then there is no limit on the number of open connections.
# Note: the default number of connections is 1024 for postgres of harbor.
max_open_conns: 1000
# The default data volume
data_volume: /data/harbor/
signed certificate.
# ca_bundle:
# Clair configuration
clair:
# The interval of clair updaters, the unit is hour, set to 0 to disable the updaters.
updaters_interval: 12
trivy:
# ignoreUnfixed The flag to display only fixed vulnerabilities
ignore_unfixed: false
# skipUpdate The flag to enable or disable Trivy DB downloads from GitHub
#
# You might want to enable this flag in test or CI/CD environments to avoid GitHub rate limiting issues.
# If the flag is enabled you have to download the `trivy-offline.tar.gz` archive manually, extract `trivy.db` and
# `metadata.json` files and mount them in the `/home/scanner/.cache/trivy/db` path.
skip_update: false
#
# insecure The flag to skip verifying registry certificate
insecure: false
jobservice:
# Maximum number of job workers in job service
max_job_workers: 10
notification:
# Maximum retry count for webhook job
webhook_job_max_retry: 10
chart:
# Change the value of absolute_url to enabled can enable absolute url in chart
absolute_url: disabled
# Log configurations
log:
# options are debug, info, warning, error, fatal
level: info
# configs for logs in local storage
local:
# Log files are rotated log_rotate_count times before being removed. If count is 0, old versions are removed rather than rotated.
rotate_count: 50
# Log files are rotated only if they grow bigger than log_rotate_size bytes. If size is followed by k, the size is assumed to be in kilobytes.
# If the M is used, the size is in megabytes, and if G is used, the size is in gigabytes. So size 100, size 100k, size 100M and size 100G
# are all valid.
rotate_size: 200M
# The directory on your host that store log
location: /var/log/harbor
#This attribute is for migrator to detect the version of the .cfg file, DO NOT MODIFY!
_version: 2.0.0
# Uncomment uaa for trusting the certificate of uaa instance that is hosted via self-signed cert.
# uaa:
# ca_file: /path/to/ca
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- clair
- trivy
3,启动Harbor
修改完配置文件后,在的当前目录执行./install.sh,Harbor服务就会根据当期目录下的docker-compose.yml开始下载依赖的镜像,检测并按照顺序依次启动各镜像
五,容器的导入导出
介绍
涉及的命令有export、import、save、load
建议
可以依据具体使用场景来选择命令
若是只想备份images,使用save、load即可
若是在启动容器后,容器内容有变化,需要备份,则使用export、import
1,save
命令
docker save [options] images [images...]
示例
docker save -o nginx.tar nginx:latest
或
docker save > nginx.tar nginx:latest
其中-o和>表示输出到文件,nginx.tar为目标文件,nginx:latest是源镜像名(name:tag)
2,load
命令
docker load [options]
示例
docker load -i nginx.tar
或
docker load < nginx.tar
其中-i和<表示从文件输入。会成功导入镜像及相关元数据,包括tag信息
3,export
命令
docker export [options] container
示例
docker export -o nginx-test.tar nginx-test
其中-o表示输出到文件,nginx-test.tar为目标文件,nginx-test是源容器名(name)
4,import
命令
docker import [options] file|URL|- [REPOSITORY[:TAG]]
示例
docker import nginx-test.tar nginx:imp
或
cat nginx-test.tar | docker import - nginx:imp
5,区别
export命令导出的tar文件略小于save命令导出的
export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出
基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。如下图所示,nginx:latest是save导出load导入的,nginx:imp是export导出import导入的。