Docker基本知识与常用命令

引言

学习eShopOnContainers 自然是离不开Docker的。Docker的基本知识是学习eShopOnContainers 的基础。

容器VS虚拟机

容器:将软件打包成标准化单元,以用于开发、交付和部署,而 Docker 是世界领先的软件容器平台,是业界首选。容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。

 

虚拟机(Virtual Machine):指通过软件模拟的具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。流行的虚拟机软件有VMware、Xen和HyperV,它们都能虚拟出多个计算机。

 

  容器和虚拟机具有相似的资源隔离和分配优势,但功能有所不同,因为容器虚拟化的是操作系统,而不是硬件,因此容器更容易移植,效率也更高。 

  容器是一个应用层抽象,用于将代码和依赖资源打包在一起。多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动。

  虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。管理程序允许多个 VM 在一台机器上运行。每个 VM 都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此占用大量空间。而且 VM 启动也十分缓慢。

 Docker官方文档

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,并控制如何在宿主中进行存储。
posted @ 2018-12-28 20:52  tianyamoon  阅读(250)  评论(0编辑  收藏  举报