Docker的使用
Ubuntu16.04+
在Ubuntu系统中安装较为简单,官方提供了脚本供我们进行安装。
sudo apt install curl
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun
执行这个命令后,脚本就会自动的将一切准备工作做好,并且把Docker CE 的Edge版本安装在系统中。
启动Docker CE
sudo systemctl enable docker
sudo systemctl start docker
建立docker 用户组
默认情况下,docker 命令会使用Unix socket 与Docker 引擎通讯。而只有root 用户和docker 组的用户才可以访问Docker 引擎的Unix socket。出于安全考虑,一般Ubuntu系统上不会直接使用root 用户。因此,更好地做法是将需要使用docker 的用户加入docker用户组。
注销当前用户,重新登录Ubuntu,输入docker info,此时可以直接出现信息。
配置国内镜像加速
在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
重新启动服务
1
2
|
sudo systemctl daemon-reload sudo systemctl restart docker |
IV. Docker的C/S模式
Docker 采用了C/S 架构,包括客户端和服务端。Docker 守护进程(Daemon)作为服务端
接受来自客户端的请求,并处理这些请求(创建、运行、分发容器)。
Docker 守护进程一般在宿主主机后台运行,等待接收来自客户端的消息;Docker 客户端则为用户提供一系列可执行命令,用户用这些命令实现跟Docker 守护进程交互。我们之前在Win10的命令行中便是最主要的客户端:
Docker也为我们提供了Remote API来操作Docker的守护进程,也意味着我们可以通过自己的程序来控制Docker的运行。客户端和服务端既可以运行在一个机器上,也可通过socket 或者RESTful API 来进行通信:
至于Docker的客户端与守护进程之间的通信,其连接方式为socket连接。主要有三种socket连接方式:
unix:///var/run/docker.sock
tcp://host:port
fd://socketfd
完整的Docker的C/S连接方式的本质可以一般表示为如下:
V. 使用Docker
容器的基本操作
启动一次操作容器:docker run IMAGE_NAME [COMMAND] [ARG…]
例如,启动一个容器输出hello world。由于刚装上Docker,没有任何镜像,所以会先下载一个最新的ubuntu18.04的docker镜像。一次操作容器在处理完操作后会立即关闭容器。
1
|
docker run ubuntu echo 'hello world' |
启动交互式容器:docker run -t -i –name=自定义名称 IMAGE_NAME /bin/bash
-i –interactive=true | false,默认是false
-t –tty=true | false,默认是false
–name 给启动的容器自定义名称,方便后续的容器选择操作
启动交互式的容器,就是类似虚拟机、云主机的操作方式,操作完一个命令后仍然可以继续:
1
|
docker run -i -t ubuntu /bin/bash |
查看容器:docker ps [-a] [-l]
省略 列出正在运行的容器
-a all 列出所有容器
-l latest 列出最近的容器
查看指定容器:docker inspect name | id
name指代具体的容器名称,id则是容器的唯一id标识。inspect命令可以详细的展示出容器的具体信息。
1
|
docker inspect haha |
重新启动停止的容器:docker start [-i] 容器名
实际使用时,没必要每次都重新启动一个新的容器,我们可以重新启动之前创建的容器,现实情况也需要我们这样使用。
1
|
docker start -i haha |
删除停止的容器:docker rm name | id
1
2
|
docker rm thirsty_kepler docker rm upbeat_albattani |
守护式容器
交互式容器在运行完命令退出后即停止,而实际中我们常常需要能够长时间运行,即使退出也能后台运行的容器,而守护式容器具备这一功能。守护式容器具有:
- 能够长期运行;
- 没有交互式会话;
- 适合于运行应用程序和服务。
以守护形式运行容器
我们执行完需要的操作退出容器时,不要使用exit退出,可以利用Ctrl+P Ctrl+Q代替,以守护式形式退出容器。
附加到运行中的容器
退出正在运行的容器,想要再次进入,需要使用attach命令:docker attach name | id
1
|
docker attach haha |
启动守护式容器
启动守护式容器,可以在后台为我们执行操作:docker run -d IMAGE_NAME [COMMAND] [ARG…]
当命令在后台执行完毕,容器还是会关闭。这里防止容器立刻退出,写一个脚本循环输出“hello world”。
1
|
docker run --name hiahia -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done" |
查看容器日志
当守护式容器在后台运行时,我们可以利用docker的日志命令查看其输出:docker logs [-f] [-t] [–tail] IMAGE_NAME
-f –follows=true | false,默认是false,显示更新
-t –timestamps=true | false,默认是false,显示时间戳
–tail=“all” | 行数,显示最新行数的日志
查看容器内进程
对运行的容器查看其进程:docker top IMAGE_NAME
运行中容器启动新进程
Docker的理念是一个容器运行一个服务,但是往往需要对一个服务进行监控,所以也需要在已经运行服务的容器启动新的进程:docker exec [-d] [-i] [-t] IMAGE_NAME [COMMAND] [ARG…]
1
|
docker exec -i -t hiahia /bin/bash |
停止守护式容器
发送信号停止容器:docker stop 容器名
强制停止:docker kill 容器名
VI. 案例:在容器中部署静态网站
容器的端口映射
命令:run [-P] [-p]
-P,–publish-all=true | false,大写的P表示为容器暴露的所有端口进行映射;
-p,–publish=[],小写的p表示为容器指定的端口进行映射,有四种形式:
- containerPort:只指定容器的端口,宿主机端口随机映射;
- hostPort:containerPort:同时指定容器与宿主机端口一一映射;
- ip::containerPort:指定ip和容器的端口;
- ip:hostPort:containerPort:指定ip、宿主机端口以及容器端口。
例如:
1
2
3
4
|
docker run -p 80 -i -t ubuntu /bin/bash docker run -p 8080:80 -i -t ubuntu /bin/bash docker run -p 0.0.0.0::80 -i -t ubuntu /bin/bash docker run -p 0.0.0.0:8080:80 -i -t ubuntu /bin/bash |
容器中部署Nginx服务
准备环境:
1
2
3
4
5
6
7
8
|
# 1. 创建映射80端口的交互式容器 docker run -p 80 --name web -i -t ubuntu /bin/bash # 2. 更新源 apt- get update # 3. 安装Nginx apt- get install -y nginx # 4. 安装Vim apt- get install -y vim |
创建静态页面:
1
2
3
|
mkdir -p / var /www/html cd / var /www/html vim index.html |
修改Nginx配置文件:
1
2
3
4
|
# 查看Nginx安装位置 whereis nginx # 修改配置文件 vim /etc/nginx/sites-enabled/ default |
运行Nginx:
1
2
3
4
|
# 启动nginx nginx # 查看进程 ps -ef |
验证网站访问:
1
2
3
4
5
6
|
# 退出容器 Ctrl+P Ctrl+Q # 查看容器进程 docker top web # 查看容器端口映射情况 docker port web |
通过宿主机地址加映射端口访问:
VII. 镜像基操
查看删除镜像
列出镜像:docker images [OPTIONS] [REPOSITORY]
-a,–all=false,显示所有镜像
-f,–filter=[],显示时过滤条件
–no-trunc=false,指定不使用截断的形式显示数据
-q,–quiet=false,只显示镜像的唯一id
查看镜像:docker inspect [OPTIONS] CONTAINER|IMAGE [CONTAINER|IMAGE]
-f,–format=“”
删除镜像:docker rmi [OPTIONS] IMAGE [IMAGE]
-f,–force=false,强制删除镜像
–no-prune=false,保留未打标签的父镜像
虚悬镜像:既没有仓库名,也没有标签,均为\
获取推送镜像
查找镜像:docker search [OPTIONS] TEAM
–automated=false,仅显示自动化构建的镜像
–no-trunc=false,不以截断的方式输出
–filter,添加过滤条件
拉取镜像:docker pull [OPTIONS] NAME [:TAG]
-a,–all-tags=false,下载所有的镜像(包含所有TAG)
推送镜像:docker push NAME [:TAG]
Docker允许上传我们自己构建的镜像,需要注册DockerHub的账户。
构建镜像
构建Docker镜像,可以保存对容器的修改,并且再次使用。构建镜像提供了自定义镜像的能力,以软件的形式打包并分发服务及其运行环境。Docker中提供了两种方式来构建镜像:
- 通过容器构建:docker commit
- 通过Dockerfile:docker build
使用commit命令构建镜像
命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
参数:-a,–author=“”,指定镜像的作者信息
-m,–message=“”,提交信息
-p,–pause=true,commit时是否暂停容器
使用Dockerfile文件构建镜像
Docker允许我们利用一个类似配置文件的形式来进行构建自定义镜像,在文件中可以指定原始的镜像,自定义镜像的维护人信息,对原始镜像采取的操作以及暴露的端口等信息。比如:
1
2
3
4
5
6
|
# Sample Dockerfile FROM ubuntu:16.04 MAINTAINER wgp "Kingdompin@163.com" RUN apt- get update RUN apt- get install -y nginx EXPOSE 80 |
命令:docker build [OPTIONS] DockerFile_PATH | URL | -
参数:–force-rm=false
–no-cache=false
–pull=false
-q,quite=false,构建时不输出信息
–rm=true
-t,tag=“”,指定输出的镜像名称信息
VIII. 镜像迁移
我们制作好的镜像,一般会迁移或分享给其他需要的人。Docker提供了几种将我们的镜像迁移、分享给其他人的方式。推荐镜像迁移应该直接使用Docker Registry,无论是直接使用Docker Hub还是使用内网私有Registry都可以。使用镜像频率不高,镜像数量不多的情况下,我们可以选择以下两种方式。
上传Docker Hub
首先,需要在Docker Hub上申请注册一个帐号(人机验证时需要科学上网)。然后我们需要创建仓库,指定仓库名称。
在终端中登录你的Docker Hub账户,输入docker login
,输入用户名密码即可登录成功。
查看需要上传的镜像,并将选择的镜像打上标签,标签名需和Docker Hub上新建的仓库名称一致,否则上传失败。给镜像打标签的命令如下。
1
|
docker tag <existing-image> <hub-user>/<repo-name>[:<tag>] |
其中existing-image
代表本地待上传的镜像名加tag,后面<hub-user>/<repo-name>[:<tag>]
则是为上传更改的标签名,tag不指定则为latest。
可以看到,我们重新为ubuntu:16.04的镜像打上标签,观察IMAGE ID可知,同一镜像可以拥有不同的标签名。接下来,我们利用push
命令直接上传镜像。
1
|
docker push <hub-user>/<repo-name>:<tag> |
如图,我们已经上传成功。由于之前介绍的分层存储系统,我们这里是直接对已有的ubuntu镜像进行上传,只是重新打了标签,所以真正上传的只是变化的部分。
导出文件互传
Docker 还提供了 docker load
和 docker save
命令,用以将镜像保存为一个tar文件。比如这次我们将ubuntu:latest这个镜像保存为tar文件。
查看本地磁盘,即可看见名为ubuntu18.04的tar包。我们可以将其拷贝给其他PC,利用load命令重新导入。
Docker的使用的更多相关文章
- docker——容器安装tomcat
写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...
- Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境
首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...
- Docker 第一篇--初识docker
已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...
- 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)
环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...
- docker for mac 学习记录
docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...
- scrapy爬虫docker部署
spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...
- [原][Docker]特性与原理解析
Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...
- 开发者的利器:Docker 理解与使用
困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...
- 使用python自动生成docker nginx反向代理配置
由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...
- 微服务与Docker介绍
什么是微服务 微服务应用的一个最大的优点是,它们往往比传统的应用程序更有效地利用计算资源.这是因为它们通过扩展组件来处理功能瓶颈问题.这样一来,开发人员只需要为额外的组件部署计算资源,而不需要部署一个 ...
随机推荐
- Nginx的“远方表哥”—Tengine
本文收录在Linux运维企业架构实战系列 今天想起当初研究nginx反向代理负载均衡时,nginx自身的upstream后端配置用着非常不舒服: 当时使用的淘宝基于nginx二次开发的Tengine, ...
- 16 , CSS 边框与边界
1.CSS 中边框的使用 2.CSS 中边界的使用 16.1 CSS 中边框的使用 属性名称 属性值 说明 border-color 十六进制 可依序设置上,右,下,左线颜色 英文名称 border- ...
- 第三周LINUX学习笔记
周期性任务丶find 文件查找:find命令 locate :在数据库中查找,非实时查找,精确度不高,查找速度快,模糊查找 /tmp/passwad/a.textfind:实时查找:速度慢 ,精确 ...
- python3 变量理解 解释器理解 常量理解 用户交互理解 逻辑运算
先来条NLP再说...... 九,每人都已经具备使自己快乐的资源 每一个人都有过成功快乐的体验,也即是说有使自己快乐的能力. 人类只用了大脑能力极少部分,提升大脑的运用,很多新的突破便会出现. 运用大 ...
- MongoDB安装与使用体验
1.获取并安装 具体的安装包可以到官方网站下载:http://www.mongodb.org/downloads 我看着教程就下载了linux版本吧,也不是很复杂.包的体积有点大. 安装过程比较简单, ...
- Re:Unity游戏开发有哪些让你拍案叫绝的技巧?
这是我在知乎一个问题: <Unity游戏开发有哪些让你拍案叫绝的技巧?> 下面的回答,觉得蛮有趣的,贴在这里和博客的朋友们分享下. ----- 分享一个比较好玩的内容吧. 大家都知道Uni ...
- 编译Xposed
Xposed是Android平台上的有名的Hook工具,用它可以修改函数参数,函数返回值和类字段值等等,也可以用它来进行调试.Xposed有几个部分组成: 修改过的android_art,这个项目修改 ...
- Fork/Jion框架详解
◆Fork/Jion框架可以干什么◆ 如果你要处理1万条数据,但是你的能力暂时还不够,一个简单快捷的办法就是你可以把每次只处理100条,等到处理100次之后再把所有的结果聚合起来你就处理完了这1万条数 ...
- linux入门--操作系统是什么,操作系统概述
Linux 也是众多操作系统之一,要想知道 Linux 是什么,首先得说一说什么是操作系统. 计算机是一台机器,它按照用户的要求接收信息.存储数据.处理数据,然后再将处理结果输出(文字.图片.音频.视 ...
- 查看网卡及对应的IP、MAC
#!/bin/bash# judge OS OS_release=`cat /etc/redhat-release | awk '{print $(NF-1)}'|cut -c 1`# To obta ...