docker命令
在线指导书: https://github.com/yeasy/docker_practice/blob/master/SUMMARY.md
pdf链接; https://github.com/yeasy/docker_practice/wiki/%E4%B8%8B%E8%BD%BD
- docker安装
https://www.cnblogs.com/wq3435/p/6479768.html
linux各个发行版可能自带了较老的或者非官方的docker,先进行删除
以上办法已经过时,它针对的是2018年以前的1.0-1.13版本(io版)
现在分为ce版和ee版,其实版本号好像是17.0? ce版为社区版,免费。
安装参考中文链接: http://www.runoob.com/docker/centos-docker-install.html
安装参考官方链接: https://docs.docker.com/install/linux/docker-ce/centos/#install-using-the-repository
- docker命令
交互式容器 / 守护式容器
交互式: 容器启动后就要对他进行命令行操作的,退出命令行操作环境则容器就结束了
守护式: 容器启动后他就自己默默跑着的,也就是后台运行
启停docker服务 |
sudo service docker |
参数: start 启动 stop 停止 restart 重启 |
查看版本 |
docker version |
|
搜索镜像 |
docker search xxx |
默认从https://hub.docker.com搜索镜像 |
下载镜像 |
docker pull xxx |
|
查看已经下载的镜像 |
docker images |
|
运行镜像 |
docker run |
参数: --name=[容器名] 用于设置运行的容器名 -it 等同-i -t 用于运行起来后直接进入交互模式(交互式容器) 注意: 退出容器则容器自动结束。如果希望切换成守护式容器,按ctrl+p ctrl+q -d 与-it互斥的操作,启动守护式容器,容器默默在后台运行 -P 暴露/映射所有端口 -p [主机端口:容器端口] |
列出所有容器(运行的镜像) |
docker ps |
参数: -a 列出所有容器。docker ps用于查看当前正在运行的容器, |
查看容器配置信息 |
docker inspect [容器名/容器ID] |
|
重新启停容器 |
docker start [容器名] |
参数: -i 运行后直接进入交互模式 |
删除容器 |
docker rm [容器id] |
只能删除非运行中的容器 |
连接到某个容器 |
docker attach [容器id] |
守护式容器默默运行着,想进去进行命令行操作的话,需要先连接他,这样这个容器就从守护式转成了交互式了。 |
查看容器日志 |
docker logs |
日志其实就是程序在界面上的输出(比如程序里输出的print("hello world");) 这条命令用于查看守护式容器里的程序输出,毕竟交互式的你可以直接看到。 默认不带参数的话,会看到所有输出日志。(小心会大到难以控制)
参数: -f 屏幕上一直更新日志,按ctrl+c退出 -t 给日志添加时间戳 --tail [条数] 用于显示最后多少条,如果为0,则一直跟着更新最新一条。和-f一样了 |
查看容器内运行的进程 |
docker top [容器名] |
就是看容器里正开着什么进程 |
在运行中的容器里启动新进程 |
docker exec |
这样1个容器里可以跑多个进程/服务了 我们可以把网站,数据库等等东西放一个容器里一起运行了 |
停止守护式容器 |
docker stop [容器名] docker kill [容器名] |
交互式容器你退出他就结束了,所以只有守护式容器需要额外停止。 stop是给容器中运行的进程发退出指令,等进程自己结束后,整个容器停止。 kill就是直接掐死 |
删除镜像 |
docker rmi [镜像] |
|
复制文件 |
docker cp |
支持多文件复制 从host到容器内 docker cp src/. mycontainer:/target 从容器内到host docker cp mycontainer:/src/. target
其中.的作用和*相同,代表所有文件 |
熟悉了命令行之后,其实可以使用web端来管理远程docker服务器: https://portainer.io
据说Kitematic更好用,但是只有win和mac版。
- 自建仓库
所谓自建仓库就是在自己服务器上拥有自己的镜像仓库
自建仓库需要官方的Registry镜像,官方描述: The Docker Registry implementation for storing and distributing Docker images.
Registry就是一个用来管理镜像的服务(程序),并以镜像形式提供给你用了(这就是docker伟大之处)
放个链接不做深入讨论: http://www.cnblogs.com/lienhua34/p/4922130.html
注意,关于自建仓库时候的 目录挂载操作,其实是将Host机里的一个目录挂到容器里面去,如果Host机的目录不存在则自动创建。
为什么要挂载目录? 因为仓库管理程序Registry是运行在容器里的,那上传的镜像也会保存在这个镜像的容器里,无论是硬盘操作效率还是维护操作成本,都会略高一点。
如果把容器里的文件夹直接映射到Host机里的文件夹,那在容器里对文件夹的操作其实就是在Host机里对文件夹操作,磁盘效率高,维护人员也不需要有docker知识直接备份Host里的文件夹即可。
一个坑注意: 使用http方式上传镜像可能报错,需要设置解除安全限制(因为默认允许https不允许http)
附一篇在阿里云建私有docker仓库的文章: https://www.mykernel.cn/archives/487
- 远程docker管理 GUI:
portainer
- mysql:
- 目前使用阿里的alisql(mysql的一个分支),据说是在快速写入和维护方面做了很多优化
注意pull的时候要指定tag为centos (https://hub.docker.com/r/alisql/alisql/)
docker pull alisql/alisql:centos
docker run --name [容器名alisql-tst] -e MYSQL_ROOT_PASSWORD=[设初始密码123456] -d -p [主机端口]:[容器端口3306] alisql/alisql:centos
上面这步run可能会报错!因为有些数据库因为引擎的需要必须关闭THP,而alisql刚好使用了那种引擎。所以要先关闭THP,否则会启动失败。
修改方案: https://newbiedba.wordpress.com/2015/09/07/disabling-transparent-huge-pages-in-centos-7-x/
简单描述就是在 /etc/rc.d/rc.local 里面写1句话后保存退出
echo never > /sys/kernel/mm/transparent_hugepage/enabled
随后执行
chmod u+x /etc/rc.d/rc.local
执行reboot重启linux,这时候docker run就能成功了
关于修改密码:
参考链接: https://www.cnblogs.com/liufei88866/p/5619215.html
docker下alisql:centos的版本应该是mysql 5.6.x
安装时候如果开启了远程root连接,则root实际上有2个密码(实际上对应2条user记录),一个是host='localhost'代表本地登录的root, 一个是host='%'代表远程登陆的root
所以修改root密码分别需要设定本地和远程的,当然记性好的话可以设置为不一样的
修改密码方法:
进执行命令环境
docker exec -it [容器名] bash
进mysql环境
mysql -u root
修改本地root密码
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('新密码');
修改远程root密码
SET PASSWORD FOR 'root'@'%' = PASSWORD('密码');
- 另一个选型是mariadb,以前用过还凑合
docker run -d --name mysql-tst -v /data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -p 8900:3306 mysql
- 常用指令
1. 快速进入一个正在运行的容器内
docker exec -it {容器名} bash
如果提示找不到bash,可以使用sh
docker exec -it {容器名} sh
- 基础概念和指导思想
1. 按照 Docker 最佳实践的要求,容器不应该向其存储层内写入任何数据,容器存储层要保持无状态化。所有的文件写入操作,都应该使用 数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高。
数据卷的生存周期独立于容器,容器消亡,数据卷不会消亡。因此,使用数据卷后,容器可以随意删除、重新 run,数据却不会丢失。
参考: https://blog.csdn.net/u012422829/article/details/54930799
2. 镜像构建完成后,可以很容易的在当前宿主上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
一般而言,一个仓库包含的是同一个软件的不同版本的镜像,而标签则用于对应于软件的的不同版本。我们可以通过<仓库名>:<标签>的格式来指定具体是哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。
以 Ubuntu 镜像 为例,ubuntu 是仓库的名字,其内包含有不同的版本标签,如,14.04, 16.04。我们可以通过 ubuntu:14.04或ubuntu:16.04 来具体指定哪个版本的镜像。如果忽略标签 比如 ubuntu,那将视为 ubuntu:latest。
仓库名经常以 两段式路径 形式出现,比如 jwilder/nginx-proxy,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名。但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务。