Docker概念及原理
什么是Docker容器?
从“容器”两字的字面意思来看,容器是用于容纳物品的基本装置。那么Dokcer容器技术又是什么呢?容器技术是一种沙盒技术,主要目的是为了将应用程序运行其中,与外界隔离并且方便移植到其它机器上。简单来说就是一个容纳应用的箱子,箱子中装有应用程序运行环境、应用程序运行依赖组件、程序代码及配置文件等等。
Docker的技术底座!
名称空间(Namespace)、控制组(Cgroups)、联合文件系统(UnionFS)三大技术支撑了Docker技术的实现。
Namespace
Namespace是由Linux内核提供的,是用于进程间资源隔离的技术。Linux提供了多种namespace,(如User、Mount、Network、UTS、IPC、PID)用于对多种不同资源进行隔离。容器的实质是进程,但是与直接运行在服务器上的进程不同,容器进程运行在自己独立的命名空间。因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,以及自己的用户ID空间。
cgroups
Cgroups是namespace的一种,用于实现对容器资源统计和隔离。主要用到的cgroups子系统有:cpu、blkio、device、freezer、memory,实际上Docker使用了很多的Linux隔离功能,让容器有种错觉感觉自己处于一个独立的运行空间。
UnionFS
UnionFS将多个物理位置不同的文件目录联合起来,挂载到某一目录下,形成一个抽象的文件系统。Docker中用到的是AUFS,AUFS是UnionFS的升级版,它有更佳性能和效率。AUFS是Docker镜像分层技术的基础。
Docker架构
Docker主要由image(镜像)、container(容器)、registry(远程仓库)、client(客户端)、hosts(主机)等几部分组成
Docker安装
使用脚本安装
1.使用官方脚本安装
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
2.使用国内daocloud安装脚本安装(推荐)
curl -sSL https://get.daocloud.io/docker | sh
手动安装
卸载旧版本
sudo yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
安装依赖软件及配置存储库
sudo yum install -y yum-utils
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker引擎
sudo yum -y install docker-ce docker-ce-cli containerd.io
也可指定版本号安装
$ sudo yum install docker-ce-<VERSION_STRING> docker-ce-cli-<VERSION_STRING> containerd.io
启动docker
systemctl enable docker --now
Docker镜像常用操作命令
命令 | 描述 |
---|---|
docker image history <imagename/imageid> | 查看镜像历史记录 |
docker image inspect <imagename/imageid> | 显示镜像详细信息 |
docker images 或者 docker image ls | 列出本地服务器镜像列表 |
docker image prune | 删除未使用的镜像 |
docker pull imagename:tag | 从远程仓库拉取镜像到本地服务器 |
docker push imagename:tag | 推送本地镜像到远程仓库 |
docker image rm <imagename/imageid> | 删除镜像 |
docker tag imagename:tag newimagename:tag | 给镜像打标签 |
docker save imagename:tag -o imagename.tar | 将镜像导出到tar文件 |
docker load -i imagename.tar | 将导出的镜像tar文件加载为docker镜像 |
Docker image常用命令示例
列出本地主机镜像列表
sudo docker images或docker image ls
展示出的所有列各项说明
名称 | 作用 |
---|---|
REPOSITORY | 镜像仓库地址 |
TAG | 镜像ID |
IMAGE ID | 镜像标签 |
CREATED | 镜像的创建时间 |
SIZE | 镜像大小 |
查找镜像
1.在Docker Hub官方网站搜索镜像,Docker Hub
2.在安装了Docker的客户端的命令行搜索镜像
docker search <imagename>
从远程仓库拉取镜像
1.不指定版本号的话,默认拉取镜像时会拉取远程仓库的(latest)最新版镜像
docker pull nginx
也可以指定版本号拉取远程仓库的docker镜像
docker pull nginx:<version>
推送本地镜像到远程仓库及创建标签
推送本地镜像到远程仓库需要先在远程仓库建立对应的仓库地址而且标签要与远程仓库一致
给镜像打标签
docker tag nginx:latest repo.haubo.cn/k8s-test/nginx:v1
推送到远程仓库(需先登录远程仓库)
docker push repo.haubo.cn/k8s-test/nginx:v1
Docker容器常用操作指令
命令 | 说明 |
---|---|
docker run | 创建并启动一个容器 |
docker exec containerID/containername /bin/bash | 进入容器 |
docker ps containerID/containername | 查看容器运行信息及状态 |
docker ps -a | 查看所有容器运行状态 |
docker logs containerID/containername | 查看容器日志 |
docker rm containerID/containername | 删除容器前提是容器处于非运行状态 |
docker create | 创建容器但不启动 |
docker top containerID/containername | 查看容器中进程 |
docker cp | 容器与物理机之间进行数据复制 |
docker start | containerID/containername启动容器 |
docker stop containerID/containername | 停止容器 |
docker restart containerID/containername | 重启容器 |
docker pause/docker unpause containerID/containername | 暂停/恢复容器 |
docker rename 原容器名称 新容器名称 | 容器重命名 |
Docker container常用命令示例
创建并运行一个容器
docker run 常用参数
参数 | 作用 |
---|---|
-d | 后台运行容器,并返回容器ID |
-i | 以交互式运行容器,通常与-t结合使用 |
-p | 端口映射,格式为:宿主机端口:容器端口 |
-t | 为容器重新分配一个伪输入终端,通常与-i结合使用 |
–name=“xxxname” | 为容器指定一个名称 |
–dns xx.xx.xx.xx | 为容器指定一个dns服务器,默认与宿主机一致 |
-h | 指定容器的hostname |
-e arg=“value” | 设置环境变量 |
-env-file=[] | 从指定文件读入环境变量 |
–expose=[] | 开放一个端口或者一组端口 |
–cpuset=“0-2” or --cpuset=“0,1,2” | 绑定容器到指定的cpu运行 |
-m | 设置容器使用内存的最大值 |
-v 宿主机目录 容器目录 | 挂载容器目录到宿主机目录 |
示例
root@VM-16-9-ubuntu:~# docker run -it -d --name demo-container -p 8888:80 -v /data:/usr/share/nginx nginx:latest
0e704352c433c916927f5c5ce60c5e4726374cc9be7ed8c1f02b5b3e48f6770b
停止容器
root@VM-16-9-ubuntu:~# docker stop demo-container
demo-container
启动容器
root@VM-16-9-ubuntu:~# docker start demo-container
demo-container
删除容器
root@VM-16-9-ubuntu:~# docker rm demo-container
demo-container
进入容器
root@VM-16-9-ubuntu:~# docker exec -it demo-container /bin/bash
root@d8da369a13a5:/# ls
bin boot dev docker-entrypoint.d docker-entrypoint.sh etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
查看docker容器日志
docker logs demo-container
复制宿主机文件到容器内
docker cp /root/demo.txt demo-container:/tmp
复制docker容器内部文件到宿主机
docker cp demo-container:/opt/test.txt /tmp
使用Dockerfile构建docker镜像
Dockerfile常用指令
指令 | 作用 |
---|---|
FROM | 指定基础镜像 |
MAINTAINER | 指定镜像维护者信息 |
RUN | 执行命令 |
CMD | 用于指定在容器启动时所要执行得命令 |
EXPOSE | 声明容器的服务端口 |
ENV | 设置环境变量 |
COPY | 复制文件 |
ADD | 更高级的复制文件命令文件为压缩包时会自动解压 |
ENTRYPOINT | 给容器配置一个可执行程序 |
VOLUME | 挂在宿主机目录 |
USER | 指定当前用户 |
WORKDIR | 指定工作目录 |
LABEL | 为镜像添加元数据 |
Dockerfile示例
编写Dockerfile文件
root@VM-16-9-ubuntu:~# cat Dockerfile
FROM nginx
MAINTAINER Huang-Bo "17521365211@163.com"
RUN echo "这是使用Dockerfile构建的本地镜像!" > /usr/share/nginx/html/index.html
WORKDIR /etc/nginx
EXPOSE 80
使用docker build构建镜像
root@VM-16-9-ubuntu:~# docker build -t myngx -f Dockerfile .
Sending build context to Docker daemon 146MB
Step 1/5 : FROM nginx
latest: Pulling from library/nginx
1efc276f4ff9: Pull complete
baf2da91597d: Pull complete
05396a986fd3: Pull complete
6a17c8e7063d: Pull complete
27e0d286aeab: Pull complete
b1349eea8fc5: Pull complete
Digest: sha256:790711e34858c9b0741edffef6ed3d8199d8faa33f2870dea5db70f16384df79
Status: Downloaded newer image for nginx:latest
---> b692a91e4e15
Step 2/5 : MAINTAINER Huang-Bo "17521365211@163.com"
---> Running in 5aae230aa4d3
Removing intermediate container 5aae230aa4d3
---> 2a440c8e7947
Step 3/5 : RUN echo "这是使用Dockerfile构建的本地镜像!" > /usr/share/nginx/html/index.html
---> Running in 44698fb7c2e8
Removing intermediate container 44698fb7c2e8
---> 47d048cf8b07
Step 4/5 : WORKDIR /etc/nginx
---> Running in 57824a5b893c
Removing intermediate container 57824a5b893c
---> 0aee16bf06b4
Step 5/5 : EXPOSE 80
---> Running in 0b9ae94d1c35
Removing intermediate container 0b9ae94d1c35
---> 667135d55138
Successfully built 667135d55138
Successfully tagged myngx:latest
使用我们自己构建的镜像启动一个容器
root@VM-16-9-ubuntu:~# docker run -it -d --name demo-myngx -p 8888:80 myngx:latest
######在宿主机访问容器看下效果
root@VM-16-9-ubuntu:~# curl 127.0.0.1:8888
这是使用Dockerfile构建的本地镜像!