Docker
- 什么是Docker
- Docker的基本组成
- Docker和虚拟机
- Docker的应用场景
- Docker环境的安装
- 镜像管理
- 容器管理
- Docker数据卷
- Docker的网络管理
- Dockerfile
- Dcoker仓库harbor
什么是Docker
- 使用广泛的开源容器引擎
- 一种操作系统级的虚拟技术
- 依赖于Linux内核特性:Namespaces和Cgroups
- 一个简单的程序打包工具
Docker的基本组成
- Docker Client 客户端
- Docker daemon 守护进程
- Docker Image 镜像
- Docker Container 容器
- Docker Registry 仓库
Docker和虚拟机
Docker | 虚拟机 | |
---|---|---|
启动速度 | 秒级 | 分钟级 |
运行性能 | 接近原生 | 5%左右的损失 |
磁盘占用 | MB | GB |
数量 | 成百上千 | 一般几十台 |
隔离性 | 进程级别 | 系统级别 |
操作系统 | 只支持Linux | 几乎所有 |
封装程度 | 只打包项目代码和依赖关系,共享宿主机内核 | 完整的操作系统 |
Docker的应用场景
- 应用程序的打包和发布
- 应用程序的隔离
- 持续集成
- 部署微服务
- 快速搭建测试环境
- 提供PaaS产品
Docker环境的安装
官方文档安装地址:
https://docs.docker.com/engine/install/centos/
- 下载docker的yum源
yum install yum-utils
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
- 配置阿里云源
- 安装Docker
yum install docker-ce
- 启动docker
systemctl start docker
systemctl enable docker
- 测试
[root@localhost yum.repos.d]# docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:09ca85924b43f7a86a14e1a7fb12aadd75355dea7cdc64c9c80fb2961cc53fe7
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
镜像管理
什么是镜像
一个不包括linux内核的简易的Linux系统
修改国内源
[root@localhost ~]# cat /etc/docker/daemon.json
{
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
[root@localhost ~]# systemctl restart docker
基础命令
查看本地所有的镜像
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
查看一个镜像的创建历史
[root@localhost ~]# docker image history hello-world
IMAGE CREATED CREATED BY SIZE COMMENT
feb5d9fea6a5 3 months ago /bin/sh -c #(nop) CMD ["/hello"] 0B
<missing> 3 months ago /bin/sh -c #(nop) COPY file:50563a97010fd7ce… 13.3kB
查看一个镜像的详细信息
[root@localhost ~]# docker image inspect hello-world
从仓库中拉取一个镜像
[root@localhost ~]# docker image pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
删除一个镜像
[root@localhost ~]# docker image rm hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:09ca85924b43f7a86a14e1a7fb12aadd75355dea7cdc64c9c80fb2961cc53fe7
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
给一个镜像打标签
[root@localhost ~]# docker tag centos:latest centos:8.4
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8.4 5d0da3dc9764 3 months ago 231MB
centos latest 5d0da3dc9764 3 months ago 231MB
保存一个镜像到本地
[root@localhost ~]# docker image save centos:8.4 > centos:8.4.tar.gz
[root@localhost ~]# ll centos:8.4.tar.gz
-rw-r--r--. 1 root root 238581248 Jan 13 00:15 centos:8.4.tar.gz
导入一个镜像
[root@localhost ~]# docker image rm centos:8.4
Untagged: centos:8.4
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 5d0da3dc9764 3 months ago 231MB
[root@localhost ~]# docker load < centos\:8.4.tar.gz
Loaded image: centos:8.4
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 8.4 5d0da3dc9764 3 months ago 231MB
centos latest 5d0da3dc9764 3 months ago 231MB
导出一个容器
docker export 'CONTAINER ID' > xxxx.tar
导入容器创建镜像
docker image import xxxx.tar 名字:标签
容器管理
创建容器命令:
[root@localhost ~]# docker run -itd --name centos centos:8.4
创建容器常用选项
选项 | 描述 |
---|---|
-i | 交互式 |
-t | 分配一个伪终端 |
-d | 运行容器到后台 |
-a list | 附加到运行的容器 |
--dns list | 设置DNS服务器 |
-e | 设置环境变量 |
--env-file list | 从文件读取环境变量 |
-p list | 发布容器端口到主机 |
-P | 发布容器所有EXPOSE的端口到宿主机的随机端口 |
-h | 设置容器主机名 |
--ip string | 指定容器IP,只能用于自定义网络 |
--link list | 添加连接到另一个容器 |
--network | 连接容器到一个网络 |
--mount | 挂载宿主机分区到容器 |
-v | 挂载宿主机目录到容器 |
--restart string | 容器退出时重启策略,默认no |
--add-host list | 添加其他主机到容器中/etc/hosts |
资源限制选项
容器管理常用命令
使用方法:
docker container [选项]
选项:
ls 列出容器
inspect 显示一个或多个容器详细信息
attach 附加本地标准输入,输出和错误到一个运行的容器
exec 在运行容器中执行命令,也可以进入一个容器
commit 创建一个新镜像来自一个容器
cp 拷贝文件或者文件夹到容器
logs 获取一个容器的日志
port 列出或指定容器端口映射
stats 显示容器资源使用统计
top 显示一个容器运行的进程
update 更新一个或多个容器的配置
stop/start 停止/启动一个或多个容器
rm 删除一个或多个容器
Docker数据卷
Docker提供三种不同的方式将数据从宿主机挂载到容器中:volumes,bind mounts和tmpfs
volumes:Docker管理宿主机文件系统的一部分(/var/lib/dokcer/volumes)
bind mounts:可以存储在宿主机系统的任意位置
tmpfs:挂载存储在宿主机内存中,而不会写入宿主机的文件系统
volumes管理指令
[root@192 ~]# docker volume --help
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.
挂载实例:
- 创建一个volume
docker volume create nginx-vol
- 用卷创建一个容器
docker run -d -it --name=nginx-test --mount src=nginx-vol,dst=/usr/share/nginx/html nginx
bind mounts
- 用卷创建一个容器:
docker run -d -it --name=nginx02 --mount type=bind,src=/app/wwwroot,dst=/usr/share/nginx/html nginx
注意:
如果挂载目标在容器中非空目录,则改目录现有内容将会被隐藏。
Docker的网络管理
Docker支持5种网络模式
bridge:默认网络,Docker启动后默认创建一个docker0网桥,默认创建的容器也是添加到这个网桥中。
host:容器不会获得一个独立的network namespace,而是与宿主机共用一个
none:获取独立的network namespace,但不为容器进行任何网络配置
container:与指定的容器使用同一个network namespace,网卡配置也都是相同的
自定义:自定义网桥,默认与bridge网络一样。
Dockerfile
Dockerfile指令
指令 | 描述 |
---|---|
FROM | 构建新镜像基于哪个镜像,例如:FROM centos:7 |
MAINTAINER | 描述这个Dockerfile的作者信息,例如:MAINTAINER xxxxx xxxxxxx@163.com |
RUN | 构建镜像时运用的shell命令,例如:RUN yum install httpd |
CMD | 运行容器时执行的shell命令 |
EXPOSE | 声明容器运行的服务端口 |
ENV | 设置容器内环境变量,例如设置JAVA_HOME |
ADD | 拷贝文件或目录到镜像,自动解压压缩包,例如:ADD html.tar.gz /usr/local/html |
USER | 为RUN和CMD设置运行用户 |
COPY | 拷贝文件或目录到镜像,用法同上 |
WORKDIR | 为RUN和CMD设置工作目录 |
HEALTHCHECK | 健康检查 |
ARG | 构建镜像时设置一个变量,可以在build的时候导入 |
Build镜像命令
docker build
参数:
-t #镜像名称
-f #指定Dockerfile文件位置
Dcoker仓库harbor
- 下离线安装包,直接官网下载就好
https://github.com/goharbor/harbor/releases
- 安装Docker
- 安装docker-compose
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose version
- 自签TLS证书
解压harbor-offline-installer-v1.4.0.tgz
tar -xzvf harbor-offline-installer-v1.4.0.tgz
创建证书
harbor23.com这里是我harbor仓库的域名,即harbor配置文件中hostname的值,也可以写ip
cd harbor
mkdir ssl
cd ssl
openssl genrsa -out ca.key 4096
openssl req -x509 -new -nodes -sha512 -days 3650 -subj "/CN=harbor23.com" -key ca.key -out ca.crt
openssl genrsa -out server.key 4096
openssl req -new -sha512 -subj "/CN=harbor23.com" -key server.key -out server.csr
cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor23.com
EOF
openssl x509 -req -sha512 -days 3650 -extfile v3.ext -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
- 修改harbor.cfg配置文件
主要修改一下参数
hostname = harbor23.com
ui_url_protocol = https
ssl_cert = ./ssl/server.crt
ssl_cert_key = ./ssl/server.key
harbor_admin_password = 123
- 安装
./prepare
./install.sh
- 配置hosts域名解析
C:\Windows\System32\drivers\etc\hosts - 访问配置文件中设置的hostname
admin/配置文件中设置的密码
创建一个项目和用户
将新建的用户加入test项目
将镜像上传harbor
- 在docker镜像机器上加入证书
mkdir /etc/docker/certs.d/harbor23.com -p
scp 192.168.168.130:/root/harbor/ssl/server.crt /etc/docker/certs.d/harbor23.com
- 在daemon.json文件中配置
[root@192 harbor23.com]# cat /etc/docker/daemon.json
{
"registry-mirrors": [
"https://docker.mirrors.ustc.edu.cn"
],
"insecure-registries": [
"harbor23.com"
]
}
- 测试连接
[root@192 harbor23.com]# docker login harbor23.com
Username: xcn
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
- 上传镜像
docker tag nginx harbor23.com/test/nginx:v1
docker push harbor23.com/test/nginx:v1
- 下载镜像
docker pull harbor23.com/test/nginx:v1