【一】、docker基础
什么是dockerdocker是一个容器引擎,提供了一整套完整的容器解决方案。它是在2014年最火热的开源项目,基于Apache2.0开原协议,由Go语言开发。什么是容器容器其实历史比较久远,Linux上的LXC、Solaris上的Zones等都是容器的不同实现方式。容器实质上是一个运行在宿主机上的进程。只不过在这个进程启动之前进行了一些处理,让进程进入了一个全新的虚拟环境...
什么是docker
docker是一个容器引擎,提供了一整套完整的容器解决方案。它是在2014年最火热的开源项目,基于Apache2.0开原协议,由Go语言开发。
什么是容器
容器其实历史比较久远,Linux上的LXC、Solaris上的Zones等都是容器的不同实现方式。
容器实质上是一个运行在宿主机上的进程。只不过在这个进程启动之前进行了一些处理,让进程进入了一个全新的虚拟环境,与宿主机的环境分离。所以这个进程认为自身处于一个独立的运行世界中。
一个简单的例子是:在容器中创建的文件在宿主机上是看不到的。
容器的优势
- 容器创建、删除速度快
- 容器在运行期间占用的开销比较小,在一个宿主机上,容器运行的数量可以很多
docker的优势
- 容器管理很方便
安装docker-ce
在2017年docker将docker版本分为了 CE 和 EE 版本,EE 就是企业版本,CE 就是社区版本。
前提条件
docker已经可以运行在多种操作系统上甚至windows上,这里我采用centos7.3来安装。docker对操作系统要求如下:
- 内核版本大于3.10:可通过uname -r
查看
- 系统是64位:可通过uname -i
查看
yum安装依赖包
yum install -y yum-utils device-mapper-persistent-data lvm2
添加docker官方源
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
更新yum索引
yum makecache fast
安装docker-ce
在配置好yum源后可直接使用yum命令进行安装:
yum install -y docker-ce
启动docker
安装好后启动docker:
systemctl docker start
然后可以运行下面的命令检查docker的版本:
docker version
其中几个比较重要的点:Server Version为当前版本,Storage Driver为存储驱动,Docker Root Dir为docker工作目录,Registry为默认下载镜像的地址
卸载docker
yum remove docker-ce
rm -rf /var/lib/docker
docker启动和停止
docker和其他服务一样,可以通过service命令来控制启动和停止:
'''启动'''
systemctl docker start
'''停止'''
systemctl docker stop
'''查看状态'''
systemctl docker status
'''重启'''
systemctl docker restart
docker架构
docker是一个典型的C/S架构:
docker server
这是一个守护进程,一直运行在后台,其中内嵌有一个web server
docker client
他是一个命令行工具,通过http协议与docker server进行交互
docker server和docker cliebt公用一个可执行文件,通过命令
which docker
就可以找到。
docker镜像
什么是docker镜像
简单说,Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。
docker可以理解为一个目录:docker server在启动容器的时候,先根据这个镜像目录复制出一个目录,然后在容器进程启动的时候,让这个进程chroot到这个目录下,这样这个目录就成了这个容器的根文件系统。
查看docker镜像
通过下面的命令可以查看本地有哪些docker镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/httpd latest 2e202f453940 6 weeks ago 179 MB
docker.io/centos latest ff426288ea90 2 months ago 207 MB
docker.io/hello-world latest f2a91732366c 3 months ago 1.85 kB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
- IMAGE ID:镜像ID,长度为64位,通常用前12位表示就可以了
- TAG:每个镜像可以打上多个TAG
- REPOSITORY:本地镜像存储的仓库(刚装完的docker是空的)
REPOSITORY和TAG可以唯一标识一个镜像
镜像从哪里来
Docker Hub是由Docker公司负责维护的公共注册中心,包含大量的容器镜像,Docker工具默认从这个公共镜像库下载镜像。
https://hub.docker.com/explore
默认是国外的源,下载会慢,建议配置国内镜像仓库:
# vi /etc/docker/daemon.json
{
"registry-mirrors": [ "https://registry.docker-cn.com"]
}
修改完成后需要重启docker
docker容器
运行容器
运行容器可以使用docker run命令,常用选项包括:
-i -t:这两个选项经常一起用,缩写为 -it, 用于创建交互式容器
-d:让容器运行在后台,用于创建守护式容器
--name:为容器指定名称
运行交互式容器
现在我的本地镜像如下:
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/httpd latest 2e202f453940 6 weeks ago 179 MB
docker.io/centos latest ff426288ea90 2 months ago 207 MB
docker.io/hello-world latest f2a91732366c 3 months ago 1.85 kB
docker.io/training/webapp latest 6fae60ef3446 2 years ago 349 MB
现在我通过docker.io/centos这个镜像创建一个交互式容器,命令如下:
docker run -it centos:latest /bin/bash
-it:指定创建交互式容器
centos:latest:以仓库:TAG的方式指定镜像名称
/bin/bash:容器对应的进程,会启动一个新的shell
通过上边的命令,启动了一个新的shell,这个shell是运行在容器环境中的。此时,我们离开了原本的shell,此后我们执行的shell命令都会在虚拟环境中。当我们执行exit
就结束了了这个虚拟shell,从而结束了整个容器。
[root@193cbc5e0dbe /]# ls
anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
可以看到,在执行了docker run之后产生了一个新的shell,此时的命令提示符前的目录变成了193cbc5e0dbe。当运行这个命令时镜像不存在,则docker会自动从官方镜像仓库拉取镜像并生成容器。
运行守护式容器
交互式容器适合一些临时的任务。大多数情况下,希望创建守护式容器,即长期运行提供服务。方法如下:
docker run -d redis
这里创建一个redis的容器,但是我本地没有redis镜像,所以会从官方拉取镜像并创建容器。
这里,只提供了镜像名称而没有提供TAG,则会使用默认TAG “latest”,同样的没有指定命令,则会使用镜像提供的默认命令。redis镜像的默认命令是:/entrypoint.sh redis-server
守护式容器运行在后台,而shell还是宿主机的shell,这样就可以进行其他工作而不受容器的影响。
恢复守护式容器
守护式容器运行在后台,需要恢复守护式容器到前台可以使用下面的命令:
docker attach a44303d15bfa
a44303d15bfa是容器的id,也可以是容器的NAME。
查看容器的基本信息
通过下面的命令可以查看容器的基本信息:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9cb9fe5a189 redis "docker-entrypoint..." 4 minutes ago Up 4 minutes 6379/tcp brave_mccarthy
可以看到容器的ID、使用的镜像、状态等信息
这里看不到之前交互式容器的信息,因为退出了,ps在不带有参数的时候只显示正在运行的容器。但是可以添加-a选项查看到:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f9cb9fe5a189 redis "docker-entrypoint..." 4 minutes ago Up 4 minutes 6379/tcp brave_mccarthy
193cbc5e0dbe centos:latest "/bin/bash" 17 minutes ago Exited (0) 8 minutes ago clever_roentgen
可以看到交互式容器的状态为退出。
查看容器详细信息
docker ps
命令只能查看到一些基本的内容,想要知道更详细的信息比如:ip、端口等,就需要如下命令:
docker inspect f9cb9fe5a189
其中f9cb9fe5a189是容器的ID。这个命令返回一个json格式的数据,十分详细。有时二次开发需要这个信息。
如果说只想要获取IP地址的话,可以添加如下参数:
docker inspect -f '{{.NetworkSettings.IPAddress}}' f9cb9fe5a189
{{.NetworkSettings.IPAddress}}可以理解为NetworkSettings下的IPAddress字段
停止守护式容器
停止守护式容器可以使用下面的命令:
docker stop f9cb
f9cb是容器ID的缩写,这样也是可以的,此时使用
docker ps
就看不到这个容器了。
也可以使用:
docker kill f9cb
stop和kill的区别是:stop是发送信号到容器,等待容器停止,而kill是直接杀死容器进程。
删除容器
停止容器并不会删除容器,删除容器可以使用如下的方式:
docker rm f9cb9
f9cb9是容器ID的缩写,这样在
docker ps -a
中就看不到这个容器了,它被删除了。
创建容器时指定名称
创建容器时会默认分配一个比CONTAINER ID更友好的名字,这个字段叫NAMES,可以通过下面的命令来控制容器的名字:
docker run --name test_hello -it centos echo "123"
此时,通过docker ps -a
查看,这个容器的名字是我们自己定义的:
重新启动已经停止的容器
可以通过start参数让已经停止的容器恢复运行:
docker start -i test_hello
这样就不用为运行一个命令每次创建一个新的容器。这里也可以指定容器的id
容器日志
docker logs [-f][-t][--tail]
-f:是否跟踪日志变化,默认为false
-t:是否加上时间戳,默认为false
--tail:返回后几行日志,默认为all
如果不指定选项,则返回所有的日志。
首先创建一个守护式容器,然后不指定参数查看log,则返回所有的日志。
加上-t
选项,日志加上了时间
加上-f
选项,可以看到日志的动态更新。
加上–tail选项,指定显示最新的N条
查看容器内的进程
docekr top b77a4ee19c4b
指定容器id或name
在运行的容器中启动新的进程
docker exec [-d][-i][-t] 容器名 命令 参数
docker exec -it b77a4ee19c4b /bin/bash
可以看到进入了新的bash进程,按CTRL+P CTRL+Q
让当前容器转入后台运行,然后查看进程:
可以看到在容器中启动了一个新的进程。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)