1 概述
Go语言实现,基于linux内核的cgroup/namespace/AUFS类的Union FS等技术,
对进程进行隔离封装,属于操作系统层面的虚拟化技术
2 容器 VS虚拟机
和传统虚拟化不同,传统虚拟化是虚拟出一整套硬件,在其上运营一个完成的OS,
在该OS上再运行应用进程;而容器的应用进程直接运行在宿主的内核,没有自己的内核,也没有硬件虚拟,比传统虚拟机更轻便。
3 基本概念
- 镜像 Image
- 容器 Containe
- 仓库 Repository
3.1 镜像
Docker镜像是一个特殊的文件系统,提供容器运行时所需的程序、库资源配置及一些运行时
需要的参数(环境变量、用户、匿名卷等)。镜像不包含动态数据,构建后不会改变。
3.1.1 分层存储
代码语言:txt复制镜像会分层构建,每一层构建完就固定不变了,需要变更时需在当前层基础上要新建一层。
3.2 容器
容器container时镜像运行时的实体,可以被创建、启动、停机、删除、暂停。容器的实质是进程。传统进程直接在宿主执行,容器运行在自己独立的命名空间。
3.3 仓库
docker registry 是一个集中存储、分发镜像的服务,一个registry中包含多个仓库repository;每个repository包含多个标签tag,一个tag对应一个镜像。
一个仓库一般包含同一个软件不同版本的镜像,使用<仓库命>:<标签>来指定某个版本,如ubuntu:14.4
registry 注册服务器,是管理仓库的具体服务器
repository 仓库
4 安装
代码语言:txt复制yum install -y yum-utils
device-mapper-persistent-data
lvm2
yum-config-manager
--add-repo
https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo
yum makecache fast
yum install docker-ce
systemctl enable docke
systemctl start docke
groupadd docke
usermod -aG docker $USER
参考 https://yeasy.gitbooks.io/docker_practice/content/install/centos.html
5 使用镜像
5.1 拉取
docker pull [option] [docer registry add[:port]/repository name[:tag]
如 docker pull ubuntu:18.04
5.2 运行
代码语言:javascript复制 docker run -it --rm
ubuntu:18.04
bash
说明
代码语言:javascript复制 -it -i 交互式操作
-t 终端
--rm 容器退出后删除
ubuntu:18.08 指定镜像
bash 镜像后的命令
5.3 ls镜像
docker image ls
5.4 删除本地镜像
docker image rm option <镜像1><镜像2>...
5.5 commit镜像
代码语言:txt复制 先建立一个nginx测试镜像
docker run --name websvr -d -p 80:80 nginx
启动bash修改文件
docer exec -it websvr bash
修改index.html启动页内容
cat /usr/share/nginx/html/index.html (先查看后覆盖))
echo '<h1>hello fank docker</h1>' > /usr/share/nginx/html/index.html
exit
刷新localhost查看index发生了变化,此时容器的文件已被修改
执行commit 保存镜像
docker commit --author 'fank' --message 'modify index.html' websvr nginx:v2
查看
docker image ls
diff 检查镜像变动情况
docker diff websv
关闭
docker container ls -a
docker container rm -f websv
5.6 查看帮助
代码语言:javascript复制docker COMMAND --help
如 docker run --help
注意
实际环境中应该慎用 docker commit,频繁使用commit会使镜像越来越臃肿,而应该使用dockerfile定制镜像。
6 Dockerfile
dockerfile是一个脚本,用来构建镜像,将构建镜像需要的修改、安装、构建、操作命令记录在一个文件中。
6.1 建一个dockerfile
注意
在空目录中建立
mddir mynignx
cd myninx && touch Dockerfile
vi dockerfile
FROM nginx
RUN echo "<h1>hello docker</h1>" > /usr/share/nginx/html/index.html
COPY ./package.sjon /app/
其中, FROM用于指定基础镜像,RUN执行命令
#执行多个命令的正确写法
FROM ubuntu:18:08
RUN echo "hahah">/tmp/echo
&& cd /pacakage/ningx
&& make
&& make install
6.2 构建镜像
代码语言:javascript复制docker build -t nginx:v3 .
-t 指定名称
. 指定上下文路径为.
6.3 Dockerfile指令介绍
代码语言:javascript复制#COPY
COPY <原路径> <目标路径>
#ADD
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
ADD和copy功能类似,当需要进行自动解压缩时再使用ADD
代码语言:javascript复制#CMD 两种格式
shell格式 CMD echo $HOME
exec格式 CMD ["sh","-c","echo $HOME"]
注: docker不是虚拟机,所有在容器内执行的命令都是前台执行
代码语言:javascript复制ENTRYPOINT
入口点,让镜像变成像命令一样使用
示例:定义一个dockerfile
FROM ubuntu:18.04
RUN apt-get update
&& apt-get install -y curl
&& rm -rf /var/lib/apt/lists/*
ENTRYPOINT ["culr","-s","https://ip.cn"]
使用ENTRYPOINT后,
docker build -t myip .
docker run myip -i 则-i 可作为参数传给 ENTRYPOINT后的命令
代码语言:javascript复制#ENV 设置环境变量
定义变量 ENB VERSION=1.0 NAME="happy tom"
使用该变量
RUN grep "$NAME" test.txt
ARG 设置构建参数,将来容器运行时不保存,而ENV在容器运行时仍存在
WORKDIR 指定工作目录
USER 指定当前用户
HEALTHCHECK
ONBUILD
ONBUILD <其他指令> 只有当前镜像作为基础镜像构建新镜像时才会执行
7 操作容器
启动
代码语言:javascript复制 docker run -it ubuntu:18.04 /bin/sh
-d 后台运行 ,通过 docker container logs [ container ID or names] 查看后台运行的输出
终止
代码语言:javascript复制docker container stop ID
先查看容器,
docker container ls -a ,选择对应的container ID终止
docker container stop a87313f6956b
启动终止的容器:docker container start
进入容器
代码语言:txt复制 exec 或attach
docker run -dit 如ubuntu
docker container ls
docker exec -i 69d1 bash
docker exec -it 69d1 bash 会有命令提示符
导出导入容器 export import
代码语言:txt复制docker export [container id] >ubuntu.tar 导出快照
cat ubuntun.tar|docker import -test/ubuntu:v1.0
docker import http://xxx 从指定url导入为镜像
从容器快照中导入为镜像
删除容器
代码语言:javascript复制 先stop后才能删除
docker container rm container name
docker container prune 批量删掉所有终止状态的容器
八 访问仓库
代码语言:txt复制https://hub.docker.com 注册登陆
#搜索镜像
docker search centos
#推送镜像
打标签
docker tag ubuntu:18.04 username/ubuntu:18.04
docker push username/ubuntu:18.04
# 创建私有仓库,上传的镜像会存到本地
docker run -d -p 5000:5000 --restart=always --name registry registry
如要使用内网其他机器作为registry,可以在/etc/docker/daemon.json中增加:
insecure-registries": [
"10.168.189.10:5000"
]
九 数据管理
9.1 数据卷
数据卷是一个可供一个多个容器使用的特殊目录,可在容器见共享,对数据卷的修改会立即生效,且数据卷 的更新不影响ijngx,容器与数据卷独立,删除了容器数据卷仍在。
创建数据卷
代码语言:javascript复制 docker volume create my-vol
查看数据卷
代码语言:javascript复制 docker volume ls
查看指定数据卷信息
代码语言:javascript复制 docker volume inspect my-vol
启动一个挂载数据卷的容器 --mount
代码语言:javascript复制 docker run -it -d --name ubt_test
--mount source=/data/home/docker/voltest/,target=/data/home/vtest
ubuntu:18.04
source为宿主机的绝对路径,target为容器内的路径
验证:
docker exec -it ubt_test bash
进入/data/home/vtest可以查到挂载的目录文件
十 使用网络
10.1 端口映射
#外部访问容器
绑定地址的端口
docker run --name websvr -d -p 80:80 nginx 第一个80是宿主机的端口,第二个80是容器端口
绑定指定地址的端口
代码语言:javascript复制 docker run -d -p 127.0.0.1:5000:5000
docker run -d -p 8080:8080 可使用多个-p
-p 80:80
10.2端口互联
通过docker网络来连接
新建网络
docker network create -d bridge my-net
连接容器,让2个容器加入一个网络
代码语言:javascript复制docker run -it --rm --name t1 --network my-net busybox sh
docker run -it --rm --name t2 --netword my-net busybox sh
Compose是官方编排(Orchestration)项目之一,负责快速部署分布式应用。
11.1 术语
代码语言:txt复制服务 service :一个应用容器,可以运行多个相同镜像的实例
代码语言:txt复制项目 project :一组关联的应用容器组成的一个完整业务单元
代码语言:javascript复制安装
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod x /usr/local/bin/docker-compose
bash命令补全
curl -L https://raw.githubusercontent.com/docker/compose/1.8.0/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
命令
dokcer-compose [-f=<arg>] [options] [COMMAND] [ARGS ...]
-f ,--file File 指定模板文件
-p ,--project-name NAME 指定项目名称
摘录自 https://yeasy.gitbooks.io/docker_practice/content/basic_concept/image.html
centos安装virtualbox的办法:https://wiki.centos.org/zh/HowTos/Virtualization/VirtualBox
k8s学习笔记合集:
【k8s学习笔记一】容器及Docker基础
【k8s学习笔记二】腾讯云harbor私有仓库部署实践
【k8s学习笔记三】kubernetes本地环境部署测试
【k8s学习笔记四】kubernetes ingress测试