
目录


官方地址:Docker Documentation | Docker Documentation
CentOS安装地址:Install Docker Engine on CentOS | Docker Documentation
- yum install -y yum-utils
- yum-config-manager \
- --add-repo \
- https://download.docker.com/linux/centos/docker-ce.repo
- yum install docker-ce docker-ce-cli containerd.io -y
- vi /etc/docker.daemon.json
- {
- "registry-mirrors": ["https://tpqjuvmc.mirror.aliyuncs.com"]
- }
- #
- systemctl enable docker
- systemctl start docker
- systemctl status docker
docker info

Docker Hub 是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认公共镜像下载镜像地址 https://hub.docker.com

配置镜像加速器和harbor 仓库地址
- [root@offline-client ~]# cat /etc/docker/daemon.json
- {
- "registry-mirrors": ["https://b9pmyelo.mirror.aliyuncs.com"],
- "insecure-registries": ["winner-test.harbor.com"]
- }

Docker 把应用程序及其依赖,打包在 image 文件里面。只有通过这个文件,才能生成 Docker 容器。image 文件可以看作是容器的模板。Docker 根据 image 文件生成容器的实例。同一个 image 文件,可以生成多个同时运行的容器实例。
image 是二进制文件。实际开发中,一个image 文件往往通过继承另一个image文件(镜像层共享),加上一些个性化设置而生成。举例来说,你可以在 Ubuntu 的 image 基础上,往里面加入Apache服务器,形成你的 image。

- # 拉取nginx镜像
- docker pull nginx
- # 对nigix镜像,创建web1容器
- docker run -d --name web1 nginx
镜像拉取、启动、查看容器

容器导出 、文件复制到容器内部
- ## 容器导出
- [root@localhost ~]# docker export fd2f66e335c2 > nginx.tar
- [root@localhost ~]# ll
- total 132440
- -rw-------. 1 root root 1479 May 17 17:48 anaconda-ks.cfg
- -rw-r--r-- 1 root root 135611392 May 24 03:25 nginx.tar
- [root@localhost ~]#
- [root@localhost ~]#
- ## 文件复制到 容器的 /opt 目录下
- [root@localhost ~]# docker cp nginx.tar web:/opt
- [root@localhost ~]#
- ## 进入容器
- [root@localhost ~]# docker exec -it web bash
- root@fd2f66e335c2:/# ls /opt/
- nginx.tar
- root@fd2f66e335c2:/#

默认情况系统会将 Docker 容器存放在 /var/lib/docker 目录下,默认系统盘符需修改
迁移 docker 的存储目录,或者对 /var 设备进行扩容来达到相同的目的。更多关于 dockerd 的详细参数,请点击查看 官方文档 地址。
但是需要注意的一点就是,尽量不要用软链, 因为一些 docker 容器编排系统不支持这样做,比如我们所熟知的 k8s 就在内
改动 docker 配置文件
-
- # [方式一] 改动docker启动配置文件
- $ sudo vim /lib/systemd/system/docker.service
- ExecStart=/usr/bin/dockerd --graph=/data/docker/
-
- # [方式二] 改动docker启动配置文件
- $ sudo vim /etc/docker/daemon.json
- {
- "live-restore": true,
- "graph": [ "/data/docker/" ]
- }
修改 service 启动的配置文件, 重新使用 docker info 检查 是否修改成功。



使用 help 查看命令的使用


- ### 镜像的详细信息 打印一堆
- [root@localhost ~]# docker inspect nginx

- 1. 删除所有镜像
- docker rmi $(docker images -q)
-
- 2. 删除所有容器
- docker stop $(docker ps -a -q)
- docker rm $(docker ps -a -q)
- [root@offline-client docker]# docker save -o mysql:5.7.19.tar mysql:5.7.19
- [root@offline-client docker]# ll
- total 409904
- -rw------- 1 root root 419739136 May 14 18:54 mysql:5.7.19.tar
- [root@offline-client docker]# docker rmi mysql:5.7.19
- [root@offline-client docker]# docker load -i mysql:5.7.19.tar
镜像怎么高效存储?
难道像虚拟机一样一个容器对应一个独立的镜像文件,这样对于密集型容器,磁盘占用率太大,所以docker引入了联合文件系统,将镜像多层文件联合挂载到容器文件系统。

类似于创建软连接


容器层提供一个独立的运行环境。
镜像是只读的,类似共享形式让多个容器使用,如果要在容器里修改文件,即镜像里的文件,那该怎么办?
为此,引入写时复制(copy-on-write),需要修改文件操作时,会先从镜像里把要写得文件复制到自己的文件系统中进行修改,基于容器修改不会影响基础镜像。


- [root@offline-client mysql]# docker run -itd -p 13306:3306 -m="1024M" --privileged=true \
- > -v /opt/mysql/conf/my.cnf:/etc/my.cnf \
- > -v /opt/mysql/data:/var/lib/mysql \
- > -v /opt/mysql/log:/var/log \
- > -v /opt/mysql/mysql-files:/var/lib/mysql-files \
- > -e MYSQL_ROOT_PASSWORD=123456 --name=mysql_hue mysql:5.7.19
- 8a860ca596c82c3836f72f8b4758967f16345e30c329a2570eacb89d17bb517f
- [root@offline-client mysql]#
- [root@offline-client mysql]# docker ps -a
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 8a860ca596c8 mysql:5.7.19 "docker-entrypoint.s…" 17 seconds ago Up 17 seconds 0.0.0.0:13306->3306/tcp, :::13306->3306/tcp mysql_hue
- 9fc0e2cfe1bd gethue/hue "./startup.sh" 23 hours ago Up 23 hours 0.0.0.0:8888->8888/tcp, :::8888->8888/tcp hue01
- [root@offline-client mysql]# ls
-i : interface 交互
-t : terminal 终端
-d : detach 后台运行
-p : publis 宿主机端口映射,如上执行MySQL的端口为 13306
-m : memory容器运行内存
-v : volume 挂载一个路径,相当于软连接
-e : env指定容器内的环境变量
--name 容器命名
默认创建的容器使用宿主机所有的资源

创建一个web容器 ,memory 限制最大100M
- [root@offline-client docker]# docker run -itd -m="100M" --name=web nginx:1.17
- ecfd8658c9c2c03d6c8f16870abb00f6e461160d825d9934c42dde371218634c
- [root@offline-client docker]#
- [root@offline-client docker]# docker stats web
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- ecfd8658c9c2 web 0.00% 1.379MiB / 100MiB 1.38% 656B / 0B 0B / 0B 2
-
- [root@offline-client docker]# docker run -itd --name=web nginx:1.17
- 1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
- [root@offline-client docker]#
- [root@offline-client docker]#
- ### 没有做任何的限制,可以使用宿主机上的所有资源
- [root@offline-client docker]# docker stats web
-
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- 1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2
容器配置更新,从下面的命令可以看出容器的cpu 和内存是可以动态更新的。

资源分配测试, 不错内存限制 ,使用 宿主机的全部内存
- [root@offline-client docker]# docker run -itd --name=web nginx:1.17
- 1be2ee3f97782d78c0959d99b0a34ea9d0687cfe976c11a92b40ff8a6aa1fe7c
- [root@offline-client docker]#
- [root@offline-client docker]# docker stats web
-
- CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
- 1be2ee3f9778 web 0.00% 1.379MiB / 10.59GiB 0.01% 656B / 0B 0B / 0B 2
内存改小 好像不行

分配实践后得出:大改小不行,小改大可以内存分配实践后得出:大改小不行,小改大可以



在容器化中,一台物理计算机可以运行多个不同操作系统,那就需要解决“隔离性”,彼此感知不到对方存在,互不影响。
Linux内核从2.4.19版本引入了namespace概念,其目的是将特定的全局系统资源通过抽象的方法使得namespace中的进程看起来拥有自己隔离的资源。Docker就是借助这个机制实现容器资源隔离。

Docker利用 namespace 实现容器之间资源隔离,但是namespace 不能实现对容器资源限制,比如CPU、内存。如果某一个容器属于CPU密集型任务,那么会影响其他容器使用CPU,导致多个容器相互影响并且抢占资源。
如何对多个容器的资源使用进行限制就成了容器化的主要问题。
解决:引入 Control Groups(简称CGroups),限制容器资源
CGroups: 所有的任务就是运行在系统中的一个进程,而 CGroups 以某种标准将一组进程为目标进行资源分配和控制。
例如:CPU、内存、带宽等,并且可以动态设置。
CGroups 主要功能:


