一、安装docker
这里介绍在centos7系统上的docker安装,linux中不同系统不同版本安装docker都会有些差异。
具体步骤见后面链接:centos7中docker的安装
二、镜像的所有操作
这里介绍镜像操作的增删改查,这是docker中比较频繁的操作之一。做这些操作之前请正常安装完成docker并启动。使用docker version可查看是否正常启动了docker。
1.增加镜像(拉取镜像 )
docker image pull nginx:tag # *****************************************实战分割线***************************************** #举例子:拉取nginx的最新版本镜像 docker image pull nginx:latest docker pull nginx:latest
docker image pull 命令主体,其中image是可以省略的,在整个命令中nginx是镜像的名称,tag是版本号,他们使用冒号隔开。如果不显示指定tag时,则默认拉取最新版本也就是latest版本。
2.删除镜像
docker rmi 镜像:tag docker image rm 容器名/容器id # *****************************************实战分割线***************************************** #举例子:删除tag为latest的nginx的镜像 docker rmi nginx:latest #举例子:删除id为612开头的镜像(通过612能确认唯一id) docker image rm 612 #举例子:强制删除id为612开头的镜像(即使镜像在使用也会删除) docker image rm -f 612
这两个删除命令等价,都可以用来删除镜像,他们没有任何区别。只有使用容器名和id来做删除时会有区别。使用镜像名删除时只会删除当前镜像,不会删除与该镜像名同源的镜像,但是同源镜像的id都是相同的,所以若是使用id删除就会删除所有同源镜像。上面的示例中-f是强制的意思。这与linux的命令基本都是一致的。一般删除时还是建议使用镜像名来删除,若是使用id很可能会同时删除了多个镜像。
3.修改镜像
docker tag nginx:latest mynginx:3.3.3 # *****************************************实战分割线***************************************** #举例子:将latest版本的nginx更名为3.3.3版本的mynginx,更改后原先的镜像会依然存在 docker tag nginx:latest mynginx:3.3.3 #举例子:使用该命令可以查看所有的镜像 docker images
为本地镜像添加新的标签,本地镜像只能改镜像名称和标签,其他改不了。修改以后会出现一个新的镜像,这个镜像和原先的镜像其实都是一个镜像的不同名称而已。他们本质上还是一个。这就像java中一个对象有多个引用一样,也可以类比spring中为bean起的别名,其实他们指向的都是一个镜像。
4.查询镜像
docker images # 查询本地所有的镜像 docker image ls # 查询本地所有的镜像 docker image inspect nginx:latest # 查看本地tag为latest的nginx镜像的所有信息 docker inspect nginx:latest # 查看本地tag为latest的nginx镜像的所有信息 docker search nginx # 举例子:查询标星在200以上的nginx docker search -f=stars=200 docker search --filter=stars=200 nginx
上面介绍了三个命令,分别是查看本地所有镜像的命令images、查看本地镜像详细信息的命令inspect、查看远端所有镜像的命令。使用的话也就是上面介绍的那样了。
三、容器的所有操作
这一章节介绍关于容器的所有操作,当然这里的操作介绍的并不是非常全,但是作为基础使用基本够了。
1.增加容器
docker create -it centos:centos8 # 创建一个tag为centos8的centos容器 docker run -it centos:centos8 /bin/bash # *****************************************实战分割线***************************************** docker create -it centos:centos8 docker start 容器名/id docker run -it -d centos:centos8 /bin/bash docker ps -a # 查看本地的所有容器 docker ps # 查看所有运行中的容器
docker create和docker run命令需要说明的是,本地若是不存在该镜像,会先去远端拉取该镜像然后才会创建容器。docker run命令相当于docker create + docker start。所以说docker run是创建并启动。需要注意的是五路哪种方式创建的容器只要使用exit退出容器后,容器就会停止。
-it选项让 Docker 分配一个伪终端并绑定到容器的标准输入上,则让容器的标准输入保持打开。但是如果不连接这个终端是看不出效果的。
-d 让容器以守护进程的方式运行。容器以什么状态运行都是在创建容器时指定的,容器一旦创建完成则不能更改,若是想更改容器的运行方式只能是删除容器然后重新建立。
/bin/bash 创建容器的同时,打开一个bash终端。
2.删除容器
docker pause 容器名/id,#暂停容器,不会删除容器,应该还可以重新启动。 docker unpause 容器名/id, #取消暂停,此时容器会恢复运行状态。 docker stop 容器名/id #暂停容器的运行 docker kill 容器名/id #这是直接杀死容器 docker container prune #删除所有不在运行状态的容器。 # docker rmi (删镜像)、docker image rm(删除镜像),这俩命令与下面命令不一样需注意。 docker rm -f 容器名/id #强制删除容器,正在运行也会删除。
此命令区别与容器的删除与镜像没有关系,事实上容器是在只读镜像的基础上增加了一些操作数据而已。这也就是常说的镜像和容器的结构是分层的。
需要注意的是docker stop命令会经过两个阶段,该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发送SIGKILL 信号来终止容器,所以stop命令并不会立即停止容器,但是docker kill 命令则会立即杀死容器。
3.修改容器
严格意义上来说容器是不可以修改的,这里所指的修改是进入到容器内部,可以对容器内部进行一些操作。我们可以将容器看成虚拟机里装了某个镜像然后构成了容器。我们可以进入到这个容器然后然后修改这个虚拟机的配置项。这里就介绍到如何进入到容器内部。
docker attach 容器名/id docker exec -it 容器名/id /bin/bash #举例子:使用attach命令通过redis容器id进入到容器内部 docker attach 3b93 # 3b93是redis容器的id #举例子:使用exec命令进入到redis容器的内部 docker exec -it 3b93 /bin/bash
注意进入容器后使用exit退出时,容器就会停止。默认退出方式是ctrl+p、ctrl+q(这里注意这两个都需要执行的,先执行ctrl+p再执行ctrl+q才可以正常退出容器 ),退出时不影响容器的正确运行。不过也可以指定退出的快捷键,没什么意义,使用默认就好。不过attach命令有个很明显的缺陷,就是所有连接 到容器的客户端都是同步显示的,也就是一个终端执行命令,所有都会看到,一个终端卡住了,所有终端也会卡
住,这样总感觉不对,好像是单线程同步操作,对于多个连接来说,自己的操作很容易被打断,所有又有了exec命令。这个命令是异步的,各个终端谁操作谁的,互不影响。可以看出是多线程应用。这里的-it与创建容器的-it都是一样 的作用就是创建一个伪终端然后保持打开,上面说只能在创建容器时使用-it是对于exec命令出来之前的docker来说的。并且exec -it id /bin/bash 是推荐的打开方式。默认退出方式都是一致的都是:ctrl+p、ctrl+q。
4.查看容器
docker ps -a # 查看所有容器,包含停止运行和正在运行的容器 docker ps # 查看正在运行的所有容器 docker container inspect 容器名/id # 查看某容器的具体信息 docker top 容器名/id # 这里的top与linux系统的top命令类似 docker stats 容器名/id # 查看容器中内存、cpu等的使用情况 docker container port 容器名/id # 查看容器内的端口映射情况
这里第一、二个和最后一个可能会比较常用,第一、二个没啥需要多余声明的,最后一个命令使用时docker container port是命令,后面跟容器的id或者名称即可。
5.启动容器
docker start 容器名/id # 使用create命令创建的容器默认是关闭的,需要启动,还有容器一旦执行stop后也需要使用start启动。 docker restart 容器名/id # 重启运行中容器。 docker run -it 镜像:tag /bin/bash # 创建一个容器并运行他,并通过bash打开一个终端。
这三个是比较常用的命令,第一个是启动容器,第二个是重启,第三个是创建加启动,docker run相当于docker create 加 docker start命令的组合。
6.容器的状态:
Created : 创建后未运行过,使用create命令。
Up : 正在运行,使用run、start、unpause等命令
Up paused :被暂停,使用了pause命令
Exited :退出了,执行stop,或者bash中使用exit
四、docker使用常见问题
1.docker的登录
不登录其实并不影响我们从docker官网下载镜像,只是我们不登录便不能上传自己的镜像了,若是想要将自己的镜像上传到远端仓库则是需要登录的,登录页比较简单。
docker login # 然后根据提示输入用户名和密码即可。
2.配置阿里云镜像加速
详情请参考这篇文章:阿里云镜像加速
3.端口映射问题
# 下面是创建并打开mysql容器的典型命令,其中-p便是作端口映射使用的,-p后面冒号左面是宿主机端口,后面则是容器的占用端口。 docker run -d -e MYSQL_ROOT_PASSWORD=password --name=mymysql -p 3306:3306 mysql:5.7
尤其需要注意宿主机端口是否放行了,若是不放行累死也是访问不到的,最开始可以先用telnet命令测试下端口是否可以正常访问,若是不支持telnet命令请看第5部分,telnet不通就可以查看防火墙了,请看第4部分。
4.防火墙放行端口问题
下面列出了防火墙的常用操作命令,以供参考。
sudo systemctl status firewalld # 查看防火墙是否运行,若是运行会显示running sudo firewall-cmd --list-ports #查看端口有没有被防火墙放行,若是没有对应端口则说明未放行。 sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent # 放行3306端口,然后一定要重启防火墙 sudo systemctl restart firewalld.service # 重启防火墙 sudo firewall-cmd --list-ports # 再次查看端口有没有放行成功,下面出现3306就表示成功了 # 部分参数解释 # –zone 用以标识该端口放行的范围 # --add-port=3306/tcp 标识端口与通讯协议 # --permanent 标识重启放行依然生效
5.容器不支持telnet命令
参考这位大佬的文章:linux下安装telnet命令
6.容器不支持ps命令
以下是ps的安装命令
apt-get update && apt-get install procps
7.容器不支持vim命令
以下是安装vim命令的命令
apt-get update apt-get install vim