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

信息来源: https://www.ibm.com/developerworks/cn/cloud/library/cl-getting-started-docker-and-kubernetes/index.html

 

 

 

 

  • 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 的软件或服务。

 

 

 

 

 

 

posted @ 2020-04-13 20:28  _Jack_test  阅读(196)  评论(0编辑  收藏  举报