下面介绍下docker入门级别的命令,同时也是比较常用的、基础的docker操作,需要声明一下,本文介绍的所有有关docker的操作均在centos7下完成。本文根据使用docker的流程分为服务安装、镜像操作、容器使用、垃圾回收分为四大类,
对命令参数没有严格的区分,在以后的专题中会详细说明,本文主要用于入门
。
在centos下安装docker非常容易,只需要配置好安装源即可,本文假设源一配置好,常用的做操命令如下:
yum install -y docker
service docker start
或者 systemctl start docker
docker version
docker info
service docker stop
或者 systemctl stop docker
service docker restart
或者 systemctl restart docker
service docker enable
或者 systemctl enable docker
需要如果配置docker安装源,可使用如下命令配置
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
docker load
例子: 加载镜像文件
docker load -i xxx.tar
-i 或者 --input 后跟镜像文件包,xxx.tar通常是通过docker save 保存到本地的镜像包,更多参数介绍请参考docker load --help
docker login
例子:登陆注册服务器
docker login docker-hub -u:admin -p:password
用账户名和密码登录到docker-hub
docker pull
例子:拉取镜像mysql
docker pull mysql:5.7.17
如果未指定镜像的源,默认会从docker.io拉取镜像,也可以指定注册源,假定我们已经存在注册源docker-hub,在该注册源/database下存在mysql:5.7.17,则可以在命令行指定源:
docker pull docker-hub/database/mysql:5.7.17
docker build
例子:在当前目录下构建镜像mysql:v1
docker build -t mysql:v1 .
-t 后添加镜像名和tag名,格式imageName:tag
,例子中的镜像构建方式是最常用的
docker tag
为镜像打标签最常用的使用场景:
- 在镜像推送到注册服务器上时,最为常用。我们需要将本地的镜像推送到远程的注册服务器上时,我们需要修改镜像的名字,再推送到服务器上,例如:
docker tag tomcat:v1 docker-hub/tomcat:v1
docker push docker-hub/tomcat:v1
2.镜像更名,有的时候为了给镜像归类,需要将原来的镜像放到另一个路径下,则需tag一个新的名字,再删除原来的镜像,例如:
docker tag tomcat:v1 docker-hub/common/tomcat:v1
docker rmi tomcat:v1
docker push
存在这样的可能,我们可能会对某个镜像做些小的修改,以适应我们的工作需要。比如,我们需要在某个镜像中需要默认安装好java开发环境、mysql数据库、tomcat服务器,然后供整合团队都使用这个已经修改好的镜像,这样有一个好处,不需要每个人再去花时间修改、测试、验证镜像了。我们不妨给这个镜像取名为:web-container:v1,我们做这个镜像只是为了公司内部使用,因此我们只需要推送到我们公司内部的源上。需要换个带有注册源的名字
例子:
docker tag web-container:v1 docker-hub/common/web-container:v1
docker push docker-hub/common/web-container:v1
docker save
保存镜像为文件(有两种方式,一种是将镜像保存为文件,一种是将容器导出为文件,后面会简要说明docker export),可以将一个或者多个镜像文件导出为文件,常用格式:
docker save image:tag -o image-tag.tar
,
-o 后指定文件名,通常为镜像名和tag名的链接字符,例子:
docker save mysql:5.7.17 -o mysql-5_7_17.tar
docker rmi
删除镜像可以通过指定镜像ID或者
image:tag
例子:docker rmi mysql:5.7.17
如果想强制删除镜像,可以带参数 -f, 例如
docker rmi -f mysql:5.7.17
docker search
搜索docker hub上的镜像。例如我们想找有关mysql的镜像,然后再从中找出符合我们要求的镜像
docker search mysql
我们也可以做些过滤,添加option参数
过滤掉星星数量少于10个的mysql镜像
docker search -f stars=10 mysql
过滤掉automated=false的mysql镜像
docker search --filter=is-automated=true mysql
docker import
docker history
查看镜像的构建历史,例如:
docker history mysql
docker images
查看本地镜像列表,包括一些临时镜像
docker images -a
如果想过滤掉一些具有某种属性的镜像,则可以增添过滤条件,例如
docker images -f dangling=true
docker inspect
我们要查看mysql镜像底层的一些信息,是否对外暴露端口、文件挂载等,例如:
docker inspect mysql
docker run
运行容器,是容器操作中最为常见的操作,例如:
docker run -d --name mysql
-e MYSQL_ROOT_PASSWORD=root123
-p 3307:3306 mysql
下面详细说明下常用的命令行参数,红色部分最好能够掌握,是最常用的启动参数
容器运行于前台还是后台
-d, --detach=false 指定容器是否运行于前台,默认为false
-i, --interactive=false 是否以交互方式启动容器,通常与-t配合使用
-t, --tty=false 分配tty设备,该可以支持终端登录,默认为false
挂载容器目录到宿主机目录
-w, --workdir="" 指定容器的工作目录
指定环境变量
-e, --env=[] 指定环境变量,容器中可以使用该环境变量
指定容器的运行内存上限
-m, --memory="" 指定容器的内存上限
暴露容器端口,以及容器与宿主机之间的端口映射
-p, --publish=[] 指定容器暴露的端口
指定容器的主机名,使用场景比较少
-h, --hostname="" 指定容器的主机名
映射容器的目录到宿主机目录
-v, --volume=[] 给容器挂载存储卷,挂载到容器的某个目录
挂载其他容器存储卷岛容器目录
–volumes-from=[] 给容器挂载其他容器上的卷,挂载到容器的某个目录
–device=[] 添加主机设备给容器,相当于设备直通
–dns=[] 指定容器的dns服务器
–dns-search=[] 指定容器的dns搜索域名,写入到容器的/etc/resolv.conf文件
指定容器运行的入口
,通常是一些脚本或者命令行
–entrypoint="" 指定容器的入口点
–env-file=[] 指定环境变量文件,文件格式为每行一个环境变量
–expose=[] 指定容器暴露的端口,即修改镜像的暴露端口
容器关联
,多个容器共同完成一个服务时,比较常用,比如web服务需要后台服务、前段服务和数据库
–link=[] 指定容器间的关联,使用其他容器的IP、env等信息
指定容器运行时的名字
–name="" 指定容器名字,后续可以通过名字进行容器管理,links特性需要使用名字
指定容器的网络
–net=“bridge” 容器网络设置:
bridge 使用docker daemon指定的网桥
host //容器使用主机的网络
container:NAME_or_ID >//使用其他容器的网路,共享IP和PORT等网络资源
none 容器使用自己的网络(类似–net=bridge)但是不进行配置
设置容器是否以超级权限运行
–privileged=false 指定容器是否为特权容器,特权容器拥有所有的capabilities
容器异常退出后的重启策略
–restart=“no”
no:容器退出时不重启
on-failure:容器故障退出(返回值非零)时重启
always:容器退出时总是重启
–rm=false 指定容器停止后自动删除容器(不支持以docker run -d启动的容器)
docker exec
查看容器的运行状态
docker ps
docker ps 用于查看处于运行状态的容器,如果要查看所有状态的容器,可以添加参数
-a
,例如:docker ps -a
,如果想过滤掉不关心的容器,可以添加过滤的参数,例如:查看包含关键字filter的容器,docker ps -a | grep ‘filter’
查看处于运行停止状态的容器docker ps -a | grep Exited
docker logs
查看容器的运行日志, docker logs 后跟容器ID
docker logs ${containerId}
,如果想实时跟踪运行日志,可以添加参数-f
,docker logs -f ${containerId}
docker pause
将运行的容器导出为镜像文件
docker export
需要区分一下,和
docker save
功能类似,不同之处在于docker save为保存镜像为镜像文件,保存了镜像的所有信息,而docker export
为导出容器为镜像文件,同时会丢掉镜像运行的command,启动时需要在命令行指定相应的command,下面给出一个实例说明,启动一个正常的mysql镜像,命令如下:
docker run -d --name mysql \ -e MYSQL_ROOT_PASSWORD=root123 \ -p 3308:3306 mysql
然后我们将容器导出为mysql:v1,再重新导入,如下:
docker ps | grep mysql| awk '{print $1}' | xargs docker export > mysql-v1.tar
step2:导入为新的镜像文件:
cat mysql-v1.tar | docker import - mysql:v1
运行新的mysql容器实例,主要的区别在于,需要在启动的命令上指定command:
`docker run -d --name mysql-v1
-e MYSQL_ROOT_PASSWOR
删除一个或者容器,通常删除容器是对处于非正常运行的容器或者正常停止的容器,在删除容器前最好先用docker ps查看下状态,是否会导致数据丢失,查看确认没问题后再删除容器,可以用容器名或者容器ID删除,
docker rm container_name container_id
, 例如:
hexxdeMacBook-Pro:~ hexx$ docker ps -a af6ec418a29c mysql:v1 "docker-entrypoint.s…" 4 hours ago Exited (0) 36 minutes ago mysql-v1 150683faef0c mysql "docker-entrypoint.s…" 13 days ago Exited (0) 4 seconds ago mysql
docker rm mysql-v1 or docker rm af6ec418a29c
还有一种情况,也是比较常见的,需要停止正常运行的容器,再删除容器,
比如我们删除需要mysql,则需要先停止容器,再执行删除命令
docker stop mysql && docker rm mysql
docker restart
将处于运行状态的容器停止,然后再次启动容器,可以指定参数
- t
设定容器在多少秒后重启,例如:docker restart -t 10 mysql-v1
docker unpause
恢复暂停的容器,可以指定一个或多个容器,前提是在
docker pause
操作之后,例如:docker unease mysql-v1
docker cp
将宿主机上的文件拷贝到容器或者将容器中的文件拷贝到宿主机,例如:将当前目录的file.txt文件拷贝到容器的/root目录下
docker cp file.txt mysql-v1:/root
或者将容器中的/root/file.txt文件拷贝到宿主机的/root/目录下,例如:
docker cp mysql-v1:/root/file.txt /root/
docker commit
将容器当前的状态写到新的镜像中,成为新的镜像(这种使用场景比较少,通常我们将构建步骤写入
Dockerfile
中,然后使用docker build
来构建新镜像,这种方式可追溯,方便管理)例如:
docker commit mysql-v1 mysql:v2