Docker基本介绍和操作

Docker基本介绍和操作

Docker基本介绍

什么是Docker

Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国期间发起的一个公司内部项目,它是基于 dotCloud 公司多年云服务技术的一次革新,并于 2013 年 3 月以 Apache 2.0 授权协议开源,主要项目代码在 GitHub 上进行维护。
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。
Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护。使得 Docker 技术比虚拟机技术更为轻便、快捷。

Docker与传统虚拟化的不同

传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。

为什么使用Docker

  • 更高效的利用系统资源
  • 更快速的启动时间
  • 一致的运行环境
  • 持续交付和部署
  • 更轻松的迁移
  • 更轻松的维护和扩展

对比传统虚拟机总结,如下表:

特性 容器 虚拟机
启动 秒级 分钟级
硬盘使用 一般为 MB 一般为 GB
性能 接近原生 弱于
系统支持量 单机支持上千个容器 一般几十个

Docker基本概念

Docker 包括三个基本概念

  • 镜像(Image)
  • 容器(Container)
  • 仓库(Repository)

Docker基本操作

Docker版本介绍

docker-ce-17.09.0.ce
系统环境是linux7.x

Docker服务相关命令

启动docker服务
systemctl start docker
查看docker服务状态
systemctl status docker
关闭docker服务
systemctl stop docker
docker开机自启动
systemctl enable docker

查看Docker信息

查看docker版本
docker version
查看docker系统信息
docker info
查看docker日志信息
docker logs

Docker镜像

镜像拉取

例如以 centos 为关键词进行搜索:
docker search centos
使用公司内部镜像库
docker login dockerhub.datagrand.com
输入账号+密码
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
实战:如从公司内部镜像库下载CentOS镜像
docker pull dockerhub.datagrand.com/global/centos:7.2.1511
使用第三方镜像仓库,如Docker
实战:如从Docker镜像库下载busybox
docker pull busybox

列出镜像

要想列出已经下载下来的镜像,可以使用 docker image 命令。

REPOSITORY                             TAG                 IMAGE ID            CREATED             SIZE
busybox                                latest              e1ddd7948a1c        5 days ago          1.16MB
说明:
列表包含了 仓库名、标签、镜像 ID、创建时间 以及 所占用的空间。

镜像推送

推送至公司内部镜像库
登录公司镜像库
docker login dockerhub.datagrand.com
输入账号+密码
如我们需要将 busybox:latest 推送至global项目下,具体操作步骤如下:
docker tag e1ddd7948a1c dockerhub.datagrand.com/global/busybox:v100
其中,e1ddd7948a1c 是镜像ID,可以通过docker images来查看。

操作Docker容器

运行镜像

实战:运行busybox,容器名字是datagrand,启动sh并且将其放到后台运行。

语法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -itd --name=datagrand busybox /bin/sh
其中:
-itd这三个参数分别表示:
-i:交互式操作
-t:终端
-d:后台运行

查看容器运行状态

正在运行的容器
docker ps
查找某个正在运行的容器,如上例中的datagrand
docker ps grep datagrand
查看所有容器状态(包括运行和停止的)
docker ps -a

进入容器内部

语法:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
docker exec -it b7df818849aa /bin/sh
其中b7df818849aa为容器ID,可通过docker ps来查看。

停止、重启和删除容器

docker stop b7df818849aa
docker restart b7df818849aa
docker rm b7df818849aa
其中b7df818849aa为容器ID,可通过docker ps来查看。

删除本地镜像

语法:docker rmi [OPTIONS] IMAGE [IMAGE...]
docker rmi e1ddd7948a1c feac5e0dfdb2
其中e1ddd7948a1c和feac5e0dfdb2是镜像ID,可以通过docker images来查看。

请注意:在删除镜像之前,请将使用该镜像的容器停止和删除,否则会有如下报错:

Error response from daemon: conflict: unable to delete e1ddd7948a1c (cannot be forced) - image is being used by running container b7df818849aa
Error response from daemon: conflict: unable to delete e1ddd7948a1c (must be forced) - image is being used by stopped container b7df818849aa

镜像导出和导入

镜像导出
docker save e1ddd7948a1c |gzip > docker_file.tgz
其中,e1ddd7948a1c是镜像ID,可以通过docker images来查看。
镜像导入
docker load < docker_file.tgz
说明:
也可以使用Export和Import对容器进行导出和导入。
两者区别,这里简单说一下:
使用导出后再导入(exported-imported)的镜像会丢失所有的历史,而保存后再加载(saveed-loaded)的镜像没有丢失历史和层(layer)。这意味着使用导出后再导入的方式,你将无法回滚到之前的层(layer),同时,使用保存后再加载的方式持久化整个镜像,就可以做到层回滚(可以执行docker tag <LAYER ID> <IMAGE NAME>来回滚之前的层)。

Docker 数据管理

为什么需要数据卷

  • 当该容器不再运行时,数据将不会持久存在,并且如果另一个进程需要,则可能很难从容器中获取数据。
  • 容器的可写层紧密耦合到运行容器的主机。无法轻松地将数据移动到其他位置。
  • 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序使用Linux内核提供联合文件系统。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象降低了性能 。

Docker将数据从Docker主机安装到容器中三种方式:

  • 数据卷(Volumes)
  • 挂载主机目录 (Bind mounts)
  • tmpfs卷

容器中管理数据三种方式区别:

  • Volumes 存储在由Docker(/var/lib/docker/volumes/在Linux上)管理的主机文件系统的一部分中。非Docker进程不应修改文件系统的这一部分。卷是在Docker中保留数据的最佳方式。
  • Bind mounts 可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker主机或Docker容器上的非Docker进程可以随时修改它们。
  • tmpfs 挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。

什么是数据卷

数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:

  • 可以在容器之间共享和重用
  • 对数据卷的修改会立马生效
  • 对数据卷的更新,不会影响镜像
  • 数据卷默认会一直存在,即使容器被删除

注意:
数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。

创建和管理卷

创建一个卷
docker volume create my-vol
查看创建的卷
docker volume ls
查看卷详细信息
docker volume inspect my-vol
删除卷
docker volume rm my-vol

启动具有卷的容器

如果启动具有尚不存在的卷的容器,Docker会自动创建卷。
docker run -d   -it   --name datatest   --mount source=myvol2,target=/app   busybox
使用docker inspect devtest验证创建卷并安装正确。寻找Mounts部分:
"Mounts": [
            {
                "Type": "volume",
                "Name": "myvol2",
                "Source": "/data/sys/var/docker/volumes/myvol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
说明:mount是一个卷,它显示正确的源和目标,并且mount是可读写的。
停止容器并移除卷:
docker stop datatest
docker rm datatest
docker volume rm myvol2

使用只读卷

docker run -d   -it   --name=nginxtest   --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly   nginx:latest

使用绑定挂载(Bind mounts)

与卷相比,绑定装载具有有限的功能。使用绑定装入时,主机上的文件或目录将装入容器中。文件或目录由其在主机上的完整路径或相对路径引用。相反,当你使用卷时,会在主机上的Docker存储目录中创建一个新目录,Docker会管理该目录的内容。
该文件或目录不需要已存在于Docker主机上。如果它尚不存在,则按需创建。绑定挂载非常高效,但它们依赖于具有特定目录结构的主机文件系统。

创建source路径文件target
mkdir /tmp/target
docker run -d   -it   --name devtest   --mount type=bind,source=/tmp/target,target=/app   busybox

使用docker inspect devtest验证绑定安装正确创建。寻找Mounts部分:

"Mounts": [
            {
                "Type": "bind",
                "Source": "/tmp/target",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
说明:
这表明mount是一个bindmount,它显示了正确的源和目标,它表明mount是读写的,并且传播设置为rprivate。

停止容器:

docker stop devtest
docker rm devtest

注意:
如果将bind-mount绑定到容器上的非空目录中,则绑定装置将隐藏目录的现有内容。

使用只读绑定挂载
docker run -d   -it   --name devtest   --mount type=bind,source="$(pwd)"/target,target=/app,readonly   nginx:latest

Docker容器网络

默认网络

安装Docker时,它会自动创建三个网络。可以使用以下docker network ls命令列出这些网络:

docker network ls

NETWORK ID          NAME                DRIVER
7fca4eb8c647        bridge              bridge
9f904ee27bf5        none                null
cf03ee007fb4        host                host

说明:

  • 这三个网络内置于Docker中。运行容器时,可以使用该--network标志指定容器应连接到的网络。
  • bridge所有Docker主机上都存在默认网络。如果未指定其他网络,则新容器将自动连接到默认bridge网络。

创建网络

创建了桥接网络
docker network create --driver bridge datagrand
docker network create datatest
查看创建的网络
docker network ls
NETWORK ID          NAME                   DRIVER              SCOPE
3bf08b12e820        datagrand              bridge              local
0e155373e305        datatest               bridge              local
说明:
默认创建的是bridge网络
删除网络
docker network rm datatest datagrand

网络端口映射

-P(大写)

创建容器时,使用 -P 标志用于自动将其中的任何网络端口映射到Docker主机上临时端口范围内的随机高端口。
实战:运行一个ngin容器,将容器中的端口80 和 443 绑定到主机上的随机高端口。

docker run -itd --name nginxtest -P nginx:1.7.9 /bin/bash
查看nginx容器运行情况:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                                           NAMES
09cc5e292f7d        nginx:1.7.9                                "/bin/bash"              4 seconds ago       Up 2 seconds        0.0.0.0:32770->80/tcp, 0.0.0.0:32769->443/tcp   nginxtest
-p(小写)

说明:-p 可以多次使用该标志来配置多个端口。

  • 创建容器时,使用该-p标志将容器的端口绑定到特定端口。

实战:运行一个ngin容器,将主机的端口8080映射到容器的端口80.

docker run -itd --name nginxtest -p 8080:80  nginx:1.7.9 /bin/bash
查看nginx容器运行情况:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
89469d564c89        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:8080->80/tcp   nginxtest
  • 创建容器时,使用该-p标志将容器的端口绑定到一定范围内随机端口。

实战:运行一个ngin容器,将容器中的端口80绑定到主机上8000到9000之间的随机可用端口。

docker run -itd --name nginxtest -p 8000-9000:80  nginx:1.7.9 /bin/bash
查看nginx容器运行情况:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                           NAMES
dbaeeba59908        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 0.0.0.0:8000->80/tcp   nginxtest
  • 默认情况下,该-p标志将指定的端口绑定到主机上的所有接口。但您也可以指定绑定到特定接口,例如仅指定localhost。

实战:运行一个ngin容器,将容器中的端口80绑定到主机127.0.0.1:8080上

docker run -itd --name nginxtest -p 127.0.0.1:8080:80  nginx:1.7.9 /bin/bash
查看nginx容器运行情况:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                             NAMES
205dd2ed1640        nginx:1.7.9                                "/bin/bash"              3 seconds ago       Up 3 seconds        443/tcp, 127.0.0.1:8080->80/tcp   nginxtest

或者,要将容器的端口80绑定到动态端口,但只能在其上 localhost。

docker run -itd --name nginxtest -p 127.0.0.1::80  nginx:1.7.9 /bin/bash
查看nginx容器运行情况:
docker ps
CONTAINER ID        IMAGE                                      COMMAND                  CREATED             STATUS              PORTS                              NAMES
ba506a445ccc        nginx:1.7.9                                "/bin/bash"              2 seconds ago       Up 2 seconds        443/tcp, 127.0.0.1:32769->80/tcp   nginxtest
  • 可以通过添加尾部来绑定UDP端口/udp
docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py

原文地址:http://blog.51cto.com/wutengfei/2156381

时间: 2024-10-11 11:35:57

Docker基本介绍和操作的相关文章

Docker 常用命令与操作

介绍 此命令集合版本为 1.11.1 及以上 基础类 查看docker信息 # 查看docker版本 docker version # 显示docker系统的信息 docker info # 日志信息 docker logs # 故障检查 service docker status # 启动关闭docker sudo service docker start|stop 日志类 查看容器日志 docker logs -f <容器名orID> docker daemon 日志位置 也称之为 引擎日

docker的介绍以及常用命令

一.docker的介绍 1. Docker是什么? Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口. 详情参考:https://baike.baidu.com/item/Docker/13344470?fr=aladdin 2. Docker与vm(虚拟机)的区别 在比较虚拟机和容器时,请考虑此图: 虚拟机图 虚拟机运行来宾操作系统 - 请注意

Docker 容器介绍

Docker 容器介绍 Docker 是一个基于 Go 语言的开源应用容器引擎,它既能实现虚拟化,又可用于将应用服务打包成轻量.可移植的容器,从而可以发布到任何 Linux 平台.除了优秀了沙箱机制外,Docker 容器的开销也极低. 正如其名,Docker 所做的事情正是以一个集装箱的身份承载应用服务的运行,它与传统的 KVM.Xen 等基于硬件虚拟化的云计算系统不同,而是采用了 LXC (Linux Container) 内核虚拟化的模式,使得应用服务不再需要独立的货轮(OS)为其提供运作环

docker 实践三:操作容器

在学习了 docker 镜像的内容后,我们在来看 docker 的另一个核心点:容器. 注:环境为 CentOS7,docker 19.03 docker 的容器是镜像的一个运行实例.docker 镜像是只读文件,而容器则带有运行时的可读写层,而且容器中的应用进程处于运行状态.接下来我们就来学习 docker 容器的具体操作. 创建容器 创建容器相关的命令有 create.start.run.wait 和 logs. 新建容器 使用命令 docker [container] create 新建一

【Docker】docker 的常用命令&amp;操作

一.在linux虚拟机上安装docker XShell1:检查内核版本,必须是3.10及以上 uname -r2:安装docker yum install docker3:输入y确认安装4:启动docker [[email protected] ~]# systemctl start docker [[email protected] ~]# docker -v Docker version 19.03.2, build 6a30dfc5:开机启动docker [[email protected

docker安装以及一些操作

介绍什么是容器容器技术是一种虚拟化的方案 传统虚拟机是通过中间层,将一台或多台独立的机器虚拟运行在硬件之上 而容器时直接运行在系统内核之上的用户空间 因此,容器虚拟化也被称为操作系统虚拟化 由于运行在操作系统上,所以容器只能运行相同或相似内核的操作系统 容器:docker , k8s 什么是docker docker是能将开发的应用程序自动部署到容器的开源引擎. Github地址:https://github.com/docker/docker docker是docker.lnc公司开源的一个基

doker介绍与操作Ⅰ

1 Docker简介 docker近几年非常火,因为它是容器虚拟化,更能够充分提高硬件资源的使用率.其实利用率高不算什么,它最大的优势是能给让运维人员或者开发人员快速部署和交付资源,大大提高了工作效率.几乎所有的大企业都在使用docker,所以我们没有理由不去了解它,不去学习它.https://yeasy.gitbooks.io/docker_practice/content/introduction/what.html (感觉还不错的docker电子书) - 官网 www.docker.com

Docker入门介绍

Docker是一种虚拟化技术 ? ? ? 刚開始看Docker,感觉非常抽象"An open platform for distributed applications for developers and sysadmins"这是Docker的标语. "一个服务于分布式系统的开发人员和运维人员的开放平台".不是非常好理解,直到文档中不断地和虚拟机做对照,才理解到它可能是和虚拟机相关的技术.Docker是LXC容器技术的典型代表,LXC技术能够实如今同一主机执行多个

Docker 之 docker命令介绍

1  概述 容器状态转换相关的命令列表关系,docker的状态转换和管理的命令,即docker的生命周期管理的命令,如下截图 圆形图标表示docker的状态 方框表示命令执行命令后触发的事件 箭头的命令,为docker的相关命令,命令执行后,会触发相关事件,事件在方框内表示 菱形里的表示判断,取决于策略设定,如一旦某个容器被意外终止,如OOM,是否被restart 容器处于created或者stopped状态,可以被删除 2  命令介绍 docker pull 拉取相关镜像 每个镜像文件都有其i