Docker基本知识与常用命令
引言
学习eShopOnContainers 自然是离不开Docker的。Docker的基本知识是学习eShopOnContainers 的基础。
容器VS虚拟机
容器:将软件打包成标准化单元,以用于开发、交付和部署,而 Docker 是世界领先的软件容器平台,是业界首选。容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。
虚拟机(Virtual Machine):指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。流行的虚拟机软件有VMware、Xen和HyperV,它们都能虚拟出多个计算机。
容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。
容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。
虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且 VM 启动也十分缓慢。
Docker安装(CentOS )
Docker 要求 CentOS 系统的内核版本高于 3.10 。通过 uname -r 命令查看你当前的内核版本。
以下命令皆基于Centos,其他版本的命令会有稍有不同,本文不多做介绍。
1、初步安装和启动docker
yum update -y
yum -y install docker
systemctl start docker
2、设置镜像
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://你的的地址.m.daocloud.io
在配置完成后根据终端中的提示重启 docker使配置生效。
3、开放管理端口映射
vi /lib/systemd/system/docker.service
将第13行的ExecStart=/usr/bin/dockerd,替换为:
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock -H tcp://0.0.0.0:7654
2375是管理端口,7654是备用端口
在~/.bashrc中写入docker管理端口
export DOCKER_HOST=tcp://0.0.0.0:2375
source ~/.bashrc
4、重启docker
systemctl daemon-reload
systemctl restart docker.service
5、测试docker是否正常安装和运行
docker run hello-world
6、查看结果
Hello from Docker!
This message shows that your installation appears to be working correctly.
常用命令
运行容器(run),run是我们最常用的命令,如启动了一个nginx容器,
docker run nginx
端口映射(-p),如果我们想访问刚才部署的Nginx,需要先进行端口映射:
docker run -p 8080:80 nginx
后台运行(-d),默认情况下,当我们推出命令行时,容器也会被关闭。我们可以使用-d参数使容器保持后台运行:
docker run -d <image-name>
有了以上三个命令后,我们直接访问192.168.1.31:8080,便可以看到“Welcome to nginx!”。
指定名称(-n),创建了一个名称为redis的容器,
docker run --name myredis redis
持久化数据(-v)
容器被设计为无状态的,当我们删除一个容器时,保存在其中的数据也会随之删除。如果我们希望某些数据不随着容器的删除而删除,则可以使用目录绑定(通常称为卷),将容器中的某个文件夹于主机上的文件夹绑定,来实现数据的持久化。
docker run -v <host-dir>:<container-dir> <image-name>
除此之外,我们还可以使用Data Containers来实行数据的持久化,数据容器(Data Containers)唯一的职责就是存储和管理数据:
docker create -v /config --name dataContainer busybox
如上,我们使用busybox镜像创建了一个数据容器,并使用-v参数来指定容器存储和管理数据的目录位置。
然后我们可以将文件拷贝到容器中:
docker cp config.conf dataContainer:/config/
接下来,我们就可以在新的容器中引用该数据容器了:
docker run --volumes-from dataContainer ubuntu
新创建的ubuntu容器挂载了数据容器的/config目录。
重启策略(--restart)
通过--restart选项,可以设置容器的重启策略,以决定在容器退出时Docker守护进程是否重启刚刚退出的容器。
docker run -d --restart=always <image-name>
有如下4种重启策略:
no,默认策略,在容器退出时不重启容器
on-failure,在容器非正常退出时(退出状态非0),才会重启容器
on-failure:3,在容器非正常退出时重启容器,最多重启3次
always,在容器退出时总是重启容器
unless-stopped,在容器退出时总是重启容器,但是不考虑在Docker守护进程启动时就已经停止了的容器
进入交互模式(-it)
docker run -it [image-name] /bin/bash
-i interact 进入交互模式。
-t tty 分配一个伪终端。
执行之后,可以看到命令行的主机名已经变成了容器的Id,表示成功进入到了容器中,可以使用exit命令退出容器。
其他
# 启动一个SQLServer容器
docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=Qwer1234' -p 1433:1433 -d --restart=unless-stopped microsoft/mssql-server-linux
管理容器
下面再来一组管理容器的日常命令。
查看容器(ps),docker ps,可以看到当前运行的容器,添加-a参数,则可以看到停止的容器。
然后也可以使用inspect来查看某个容器的详细信息:dokcer inspect redis
附加容器(attach),attach可以附加到一个已经运行的容器的stdin中,docker attach [containerid]
进入容器(exec),docker exec -it [containerid] /bin/bash
是需要注意的是,对于attach,如果从这个stdin中exit,会导致容器的停止。而exec则不会,推荐使用exec。
停止容器(stop),docker stop [containerid]
删除容器(rm),docker rm [containerid]
如果要删除的容器正在运行,则无法删除,可以添加-f参数来强制删除,也可以先停止容器再删除。
如果我们想删除所有的容器,可以使用如下命令:
docker rm $(docker ps -a -q) -f
镜像管理
Docker把应用程序及其运行环境等打包在 image 文件里面,相当于容器的模板。关于Docker镜像管理,也有一系列的命令。
搜索镜像,我们可以在 registry.hub.docker.com 查找镜像,也可以使用 dokcer search <name> 命令来搜索,如:我们使用如下命令来搜索redis镜像。
docker search redis查看镜像
docker images查看镜像列表
docker image -a查看所有镜像(包括中间层镜像)
docker images -q查看所有镜像的ID
docker images -f "dangling=true"查看所有的虚悬镜像(-f 显示满足条件的镜像)
docker images [REPOSITORY]按仓库名过滤
docker images [REPOSITORY:TAG]按仓库名和标签过滤
docker rmi [imageid]删除镜像
docker image rm [imageid]删除镜像
docker image rm $(docker images -q) -f删除所有镜像
docker image prune删除虚悬镜像(dangling image)
仓库名和标签均为<none>,这类无标签、无仓储名的镜像被称为dangling image。
docker pull [imagename]拉取镜像
docker build构建镜像
docker build -t linezero/demo .
docker push [imagename]推送镜像
docker system df查看镜像、容器、卷占用的空间
Dockerfile的主要指令:
- FROM。通常情况下,你要创建的镜像是基于另外一个镜像的,这就需要使用FROM,当然也可以完全从头创建。
- MAINTAINER。该镜像的维护人。
- RUN。这里可以定义一些需要运行的命令。例如npm install,dotnet restore等等。
- COPY。开发的时候,可以把源码放在Volumes里。而在生产环境下,经常需要把源码复制到容器里面,使用COPY就可以做到这点。
- ENTRYPOINT。它可以定义容器的入口,把容器配置成像exe一样的运行文件。通常是一些例如dotnet 命令,node命令等等。
- CMD。设置容器运行的默认命令和参数。当容器运行的时候,这个可以在命令行被覆盖。
- WORKDIR。设定容器运行的工作目录。
- EXPOSE。暴露端口。
- ENV。设定环境变量。
- VOLUME。定义Volume,并控制如何在宿主中进行存储。