一、docker架构
架构一
- distribution 负责与docker registry交互,上传洗澡镜像以及v2 registry 有关的源数据
- registry负责docker registry有关的身份认证、镜像查找、镜像验证以及管理registry mirror等交互操作
- image 负责与镜像源数据有关的存储、查找,镜像层的索引、查找以及镜像tar包有关的导入、导出操作
- reference负责存储本地所有镜像的repository和tag名,并维护与镜像id之间的映射关系
- layer模块负责与镜像层和容器层源数据有关的增删改查,并负责将镜像层的增删改查映射到实际存储镜像层文件的graphdriver模块
- graghdriver是所有与容器镜像相关操作的执行者
架构二
架构三
二、安装与启动
硬件环境:4C8G物理机
系统环境:
[root@dev216 ~]# uname -r
3.10.0-957.el7.x86_64
[root@dev215 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
直接安装
[root@dev216 ~]# yum install docker
可能出现的问题:
问题一,yum中的python与系统中的不匹配
-bash: /usr/bin/yum: /usr/bin/python2.7.5: bad interpreter: No such file or directory
这是因为有人动了环境里的python,查看python
[root@dev216 ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python.bak /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/include/python2.7 /usr/share/man/man1/python.1.gz
修改yum中的python引用(或者直接备份python,将python2.7改为python)
[root@dev216 ~]# vim /usr/bin/yum
将
#!/usr/bin/python
改为
#!/usr/bin/python2.7
问题二,还是python引用的问题
[root@dev216 ~]# yum install docker
Loaded plugins: fastestmirror, langpacks
Determining fastest mirrors
* base: mirrors.huaweicloud.com
* extras: mirrors.bfsu.edu.cn
* updates: mirrors.bfsu.edu.cn
base | 3.6 kB 00:00:00
extras | 2.9 kB 00:00:00
updates | 2.9 kB 00:00:00
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:
^
SyntaxError: invalid syntax
File "/usr/libexec/urlgrabber-ext-down", line 28
except OSError, e:
^
SyntaxError: invalid syntax
Exiting on user cancel
修改/usr/libexec/urlgrabber-ext-down
vim /usr/libexec/urlgrabber-ext-down
将
#!/usr/bin/python
改为
#!/usr/bin/python2.7
启动docker
systemctl start docker.service
三、docker操作
启动与状态(centos7)
#启动、停止、重启
systemctl start/stop/restart docker
# 查看docker的运行状态,active(运行)inactive(死亡)
[root@dev216 ~]# systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2021-07-08 16:27:31 CST; 1min 29s ago
Docs: http://docs.docker.com
Main PID: 27805 (dockerd-current)
Tasks: 25
CGroup: /system.slice/docker.service
├─27805 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default...
└─27813 /usr/bin/docker-containerd-current -l unix:///var/run/docker/libcontainerd/docker-containerd.sock --...
Jul 08 16:27:30 dev216 dockerd-current[27805]: time="2021-07-08T16:27:30.088468818+08:00" level=info msg="libconta...7813"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.157415965+08:00" level=info msg="Graph mi...onds"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.158454396+08:00" level=info msg="Loading ...art."
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.166785370+08:00" level=info msg="Firewall...alse"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.246307425+08:00" level=info msg="Default ...ress"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.275860687+08:00" level=info msg="Loading ...one."
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.293321663+08:00" level=info msg="Daemon h...tion"
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.293354473+08:00" level=info msg="Docker d....13.1
Jul 08 16:27:31 dev216 dockerd-current[27805]: time="2021-07-08T16:27:31.298513884+08:00" level=info msg="API list...sock"
Jul 08 16:27:31 dev216 systemd[1]: Started Docker Application Container Engine.
Hint: Some lines were ellipsized, use -l to show in full.
docker信息
# 查看docker容器help,可以快速了解有哪些命令
docker --help
# 查看docker容器版本,包含客户端、服务端的版本信息
docker version
# 查看docker容器信息,包含version和操作系统,硬件配置等
docker info
docker debug
# 设置日志级别,默认info级别,包含"debug", "info", "warn", "error", "fatal"
docker --log-level info
四、镜像操作
镜像远程操作
# 登录账户
docker login
# 镜像搜索 ,可选参数:
# --filter 或 -f 过滤条件 -f=stars=50只显示starts>50的镜像
# --no-trunc 显示镜像的完整描述
# --limit int 一页显示几条,默认25条
# --automated 过滤automated=ok的,提示已过期,让用filter,使用却不行
docker search [-f=stars=50 --no-trunc] mysql
# 镜像拉取,-a 可选,表示全tag拉取,latest表示要拉取的镜像tag
docker pull [-a] mysql:latest
# 将镜像推送到远程仓库,将tag为yxkong的mysql镜像推送到远程仓库
docker push mysql:yxkong
示例
[root@dev216 ~]# docker search -f=stars=50 --automated python
Flag --automated has been deprecated, use --filter=automated=true instead
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
docker.io docker.io/kaggle/python Docker image for Python scripts run on Kaggle 155 [OK]
docker.io docker.io/nikolaik/python-nodejs Python with Node.js 77 [OK]
docker.io docker.io/joyzoursky/python-chromedriver Python with Chromedriver, for running auto... 58 [OK]
镜像本地操作
# 列出本地images,-a(显示所有) -f(过滤) -q(只显示镜像id)
# 不加mysql显示所有,加mysql只显示mysql的
docker images mysql
# 显示指定镜像的提交记录, -H 默认为true;-q(只显示镜像id)
docker history mysql
# 删除本地镜像 -f 强制删除,后面可以删除一个或多个
docker rmi redis mysql
# 删除本地全部镜像
docker rmi -f $(docker images -q)
# 镜像打包成tar,将redis 4.2tag的镜像打包成redis4.2.tar
dcoker save -o redis4.2.tar redis:4.2
# 从tar包载入镜像
docker load -i redis4.2.tar
# 给某个镜像打tag
docker tag
# 构建镜像 指定dockerfile构建指定tag的镜像
docker build -f /docker/dockerfile/yxk_mysql -t yxk_mysql:yxkong
五、容器操作
容器启动
# 包含两步,将镜像放入容器,再启动容器
docker run -it --name yxk_redis redis
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
options
-i 以交交互的模式运行容器 通常和-t一起使用
-t 为容器分配一个终端,通常和-i一起使用
-d 后台运行容器(类似于nohup)并返回一个容器id
-a 指定标准输入输出内容类型STDIN/STDOUT/STDERR,默认[]
-p 指定端口映射,格式为 主机:主机端口:容器端口
--name 为容器指定一个名称
--dns 指定容器使用的dns,默认和宿主一样
-h 指定容器的hostname
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行;
-e 设置环境变量
--env-file=[]: 从指定文件读入环境变量;
-m 设置容器的最大内存
--expose=[]: 开放一个端口或一组端口;
--volume , -v: 绑定一个卷
# 只是启动容器或重启容器
docker start/restart yxk_redis
容器查看
# top支持 ps 命令参数,格式:docker top [OPTIONS] CONTAINER [ps OPTIONS]
# 列出yxk_redis容器中运行进程,不加容器名就所有
docker top yxk_redis
# 查看所有运行容器的进程信息
for i in `docker ps |grep Up|awk '{print $1}'`;do echo \ &&docker top $i; done
# 查看yxk_redis容器日志,默认参数
docker logs yxk_redis
# 查看yxk_redis容器日志,参数:-f 跟踪日志输出;-t 显示时间戳;--tail 仅列出最新N条容器日志;
docker logs -f -t --tail=20 yxk_redis
# 查看容器yxk_redis从2021年07月08日后的最新10条日志。
docker logs --since="2021-07-08" --tail=10 yxk_redis
# 查看当前运行的容器,
# 参数:-a 查看全部容器(包含正在运行和历史运行过的)
# -q 查看正在运行容器的id -s 查看运行容器总文件大小
# -l 显示最近创建容器 -n 3 显示最近创建的3个容器 --no-trunc 不中断输出
docker ps -qs yxk_redis
# 获取镜像yxk_redis的元信息
docker inspect yxk_redis
# 获取正在运行的容器yxk_redis的 IP
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' yxk_redis
容器的进出
# 使用run方式在创建时进入
docker run -it centos /bin/bash
# 关闭容器并退出
exit
# 仅退出容器,不关闭
快捷键:Ctrl + P + Q
# 直接进入centos 容器启动命令的终端,不会启动新进程,多个attach连接共享容器屏幕,参数:--sig-proxy=false 确保CTRL-D或CTRL-C不会关闭容器
docker attach --sig-proxy=false centos
# 在 centos 容器中打开新的交互模式终端,可以启动新进程,参数:-i 即使没有附加也保持STDIN 打开;-t 分配一个伪终端
docker exec -i -t centos /bin/bash
# 以交互模式在容器中执行命令,结果返回到当前终端屏幕
docker exec -i -t centos ls -l /tmp
# 以分离模式在容器中执行命令,程序后台运行,结果不会反馈到当前终端
docker exec -d centos touch cache.txt
容器的操作与删除
# 停止一个运行中的容器
docker stop yxk_redis
# 杀掉一个运行中的容器
docker kill yxk_redis
# 删除一个已停止的容器
docker rm yxk_redis
# 删除一个运行中的容器
docker rm -f yxk_redis
# 删除多个容器
docker rm -f $(docker ps -a -q)
docker ps -a -q | xargs docker rm
# -l 移除容器间的网络连接,连接名为 db
docker rm -l db
# -v 删除容器,并删除容器挂载的数据卷
docker rm -v yxk_redis
容器与主机间的数据交互
# 将yxk_redis容器中的文件copy至本地路径
docker cp yxk_redis:/[container_path] [local_path]
# 将主机文件copy至yxk_redis容器
docker cp [local_path] rabbitmq:/[container_path]/
# 将主机文件copy至yxk_redis容器,目录重命名为[container_path](注意与非重命名copy的区别)
docker cp [local_path] yxk_redis:/[container_path]
所有的docker命令都可以通过以下方式获取详细说明
docker 命令 --help 会有各种参数d的详细说明
文章评论