实用的Docker入门
1 Docker概述
Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用。首先来看Docker的架构图:
理解其中几个概念:
- Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build,docker pull...)和配置标识,并与Docker daemon通信
- Images(Docker镜像):是一个只读模板,含创建Docker容器的说明,它与操作系统的安装光盘有点像
- Containers(容器):镜像的运行实例,镜像与容器的关系类比面向对象中的类和对象
- Registry:是一个集中存储与分发镜像的服务。最常用的Docker Registry是官方的Docker Hub
2 Docker安装
CentOS7系统下安装Docker为例。Docker 软件包和依赖包已经包含在默认的 CentOS-Extras 软件源里,安装命令如下:
- yum -y install docker
启动docker后台服务:
- service docker start
验证是否安装成功:
- [root@localhost hemi]# docker version
- Client:
- Version: 1.13.
- API version: 1.26
- Package version: <unknown>
- Go version: go1.8.3
- Git commit: 774336d/1.13.
- Built: Wed Mar ::
- OS/Arch: linux/amd64
- Server:
- Version: 1.13.
- API version: 1.26 (minimum version 1.12)
- Package version: <unknown>
- Go version: go1.8.3
- Git commit: 774336d/1.13.
- Built: Wed Mar ::
- OS/Arch: linux/amd64
- Experimental: false
更详细的针对各操作系统的安装见官方文档:https://docs.docker.com/install/
镜像加速
鉴于国内网络问题,后续拉取 Docker 镜像十分缓慢,我们可以需要配置加速器来解决,我使用的是网易的镜像地址:http://hub-mirror.c.163.com。
新版的 Docker 使用 /etc/docker/daemon.json(Linux) 或者 %programdata%\docker\config\daemon.json(Windows) 来配置 Daemon。
请在该配置文件中加入(没有该文件的话,请先建一个):
- {
- "registry-mirrors": ["http://hub-mirror.c.163.com"]
- }
3 Docker常用命令
3.1 镜像常用命令
1)搜索镜像
可以在Docker Hub主页上搜索镜像,可以通过docker search命令搜索,如:
- docker search [OPTIONS] TERM
OPTIONS说明:
- --automated : 只列出 automated build类型的镜像;
- --no-trunc : 显示完整的镜像描述;
- -s : 列出收藏数不小于指定值的镜像。
- [root@localhost hemi]# docker search -s 20 tomcat
- INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- docker.io docker.io/tomcat Apache Tomcat is... [OK]
- docker.io docker.io/dordoka/tomcat Ubuntu 14.04, Or... [OK]
- docker.io docker.io/tomee Apache TomEE is ... [OK]
- docker.io docker.io/davidcaste/alpine-tomcat Apache Tomcat /... [OK]
其中,
STARTS:镜像仓库收藏数
AUTOMATED:表示是否是自动构建的镜像仓库
2)下载镜像
- docker pull [OPTIONS] NAME[:TAG]
OPTIONS说明:
- -a :拉取所有 tagged 镜像
- --disable-content-trust :忽略镜像的校验,默认开启
举个栗子
- docker pull java #从Docker Hub中下载最新版本的Java镜像
- docker pull reg.itmuch.com/java: #从指定Registry中下载标签为8的Java镜像
3)列出镜像
- docker images [OPTIONS] [REPOSITORY[:TAG]]
OPTIONS说明:
- -a :列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层);
- --digests :显示镜像的摘要信息
- -f :显示满足条件的镜像;
- --format :指定返回值的模板文件;
- --no-trunc :显示完整的镜像信息;
- -q :只显示镜像ID。
举个栗子:
列出本地镜像中REPOSITORY为ubuntu的镜像列表
- [hemi@localhost ~]$ docker images ubuntu
- REPOSITORY TAG IMAGE ID CREATED SIZE
- docker.io/ubuntu latest 0458a4468cbc weeks ago 111.7 MB
- docker.io/ubuntu 15.10 9b9cb95443b5 months ago 137.2 MB
4)删除本地镜像
- docker rmi [OPTIONS] IMAGE [IMAGE...]
OPTIONS说明:
- -f :强制删除;
- --no-prune :不移除该镜像的过程镜像,默认移除;
3.2 容器常用命令
1)新建并启动容器
- docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS说明(常用):
- -d: 后台运行容器,并返回容器ID;
- --name="nginx-lb": 为容器指定一个名称;
- -i:以交互模式运行容器,通常与 -t 同时使用;
- -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用;
- -P: 随机端口映射;
- -p: 指定端口映射,有以下四种格式
- ip:hostPort:containerPort
- ip::containerPort
- hostPort:containerPort
- containerPort
- --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container:<name|id> 四种类型;
如:
- docker run --name mynginx -d nginx:latest
- #使用docker镜像nginx:latest以后台模式启动一个容器,并将容器命名为mynginx。
- docker run -p : -v /data:/data -d nginx:latest
- #使用镜像nginx:latest以后台模式启动一个容器,将容器的80端口映射到主机的91端口,主机的目录/data映射到容器的/data。
- [hemi@localhost ~]$ docker run -it nginx:latest /bin/bash
root@b8573233d675:/#
#使用镜像nginx:latest以交互模式启动一个容器,在容器内执行/bin/bash命令。
2)列出容器
- docker ps [OPTIONS]
OPTIONS说明(常用):
- -a :显示所有的容器,包括未运行的。
- -f :根据条件过滤显示的内容。
- --format :指定返回值的模板文件。
- -l :显示最近创建的容器。
- -n :列出最近创建的n个容器。
- --no-trunc :不截断输出。
- -q :静默模式,只显示容器编号。
- -s :显示总的文件大小。
3)停止容器
- docker stop CONTAINER_ID/CONTAIN_NAME
4)强制停止容器
- docker kill CONTAINER_ID/CONTAIN_NAME
5)启动已停止容器
- docker start CONTAINER_ID/CONTAIN_NAME
6)重启容器
- docker restart CONTAINER_ID/CONTAIN_NAME
7)进入容器
- docker exec -it CONTAINER_ID bash
如:
- [hemi@localhost ~]$ docker ps
- CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 219371844a81 7f94db72116e "tomcat.sh" seconds ago Up seconds /tcp, /tcp, 0.0.0.0:->/tcp zen_kalam
- [hemi@localhost ~]$ docker exec -it 219371844a81 bash
- bash-4.2$
8)删除容器
- docker rm [OPTIONS] CONTAINER [CONTAINER...]
OPTIONS说明(常用):
- -f :通过SIGKILL信号强制删除一个运行中的容器
- -l :移除容器间的网络连接,而非容器本身
- -v :-v 删除与容器关联的卷
更多命令见Docker的官方文档:https://docs.docker.com/edge/engine/reference/commandline/
也可以利用命令行查看,如:
- docker rm --help
4 入门实战
此时浏览器访问结果如下表示正常
再次访问浏览器如下结果,表示修改正常
但是此时如果重启容器,则之前的改动将失效。若要保存修改可以提交保存为新镜像↓
此过程还可以用Dockerfile完成
1、首先新建Dockerfile,内容如下:
2、在Dockerfile所在路径执行以下命令构建镜像,并运行:
浏览器访问
Dockerfile官方文档:https://docs.docker.com/engine/reference/builder/
Dockerfile最佳实践:https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
5 Docker Compose
Docker Compose用来定义和运行多应用容器。使用Docker Compose大致有3个步骤:
- 使用Dockerfile定义应用程序环境,应标在任何地方重现该环境
- 在docker-compose.yml文件中定义组成应用程序的服务,以便各个服务在一个隔离的环境中一起运行
- 运行docker-compose up 命令,启动并运行整个应用程序
5.1 安装Compose
①通过以下命令自动下载并安装适应系统版本的Compose:
- curl -L "https://github.com/docker/compose/releases/download/1.10.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
②为安装脚本添加执行权限:
- chmod +x /usr/local/bin/docker-compose
安装完成。可以使用以下命令测试安装结果:
- ocker-compose --version
5.2 安装Compose命令补全工具
- curl -L https://raw.githubusercontent.com/docker/compose/$(docker-compose version --short)/contrib/completion/bash/docker-compose -o /etc/bash_completion.d/docker-compose
输入docker-compose并按下Tab键,compose就可以自动补全命令了。
5.3 入门实例
个人博客实例,含三个层,分别为nginx、ghost app、mysql
1、创建3个目录
2、进入ghost目录,创建两个文件
① Dockerfile
- FROM ghost
- COPY ./config.production.json /var/lib/ghost/config.production.json
- EXPOSE
②config.production.json
- {
- "url": "http://localhost:2368/",
- "server": {
- "port": ,
- "host": "0.0.0.0"
- },
- "database": {
- "client": "mysql",
- "connection": {
- "host": "db",
- "user": "ghost",
- "password": "ghost",
- "database": "ghost",
- "port": ,
- "charset": "utf8"
- }
- },
- "mail": {
- "transport": "Direct"
- },
- "logging": {
- "transports": [
- "file",
- "stdout"
- ]
- },
- "process": "systemd",
- "paths": {
- "contentPath": "/var/lib/ghost/content"
- }
- }
3、进入nginx目录,配置
①Dockerfile
- FROM docker.io/nginx
- COPY nginx.conf /etc/nginx/nginx.conf
- EXPOSE 80
②nginx.conf
- worker_processes ;
- events {worker_connections ;}
- http {
- server {
- listen ;
- location / {
- proxy_pass http://ghost-app:2368;
- }
- }
- }
4、配置docker-compose.yml
在blog目录下创建docker-compose.yml文件
- version: ''
- networks:
- ghost:
- services:
- ghost-app:
- build: ghost
- networks:
- - ghost
- depends_on:
- - db
- ports:
- - "2368:2368"
- nginx:
- build: nginx
- networks:
- - ghost
- depends_on:
- - ghost-app
- ports:
- - "80:80"
- db:
- image: "mysql:5.7.15"
- networks:
- - ghost
- environment:
- MYSQL_ROOT_PASSWORD: mysqlroot
- MYSQL_USER: ghost
- MYSQL_PASSWORD: ghost
- volumes:
- - $PWD/data:/var/lib/mysql
- ports:
- - "3306:3306"
以上即可。随后在docker-compose.yml所在目录build镜像并运行
- docker-compost stop #停止容器
- docker-compose rm #删除容器
- docker-compose build #重新建立
- docker-compose up -d #启动运行
docker-compose命令-官方文档:https://docs.docker.com/compose/reference/overview/
实用的Docker入门的更多相关文章
- docker入门、LXC、windows container 和 Hyper知识基础、实用情况
虚拟机与容器 很明显可以看出两者在操作系统级别上的隔离和进程上的隔离的区别,VM因为隔离级别更高明显更重. linux容器主要技术特点: 文件系统隔离:每个容器都有自己的root文件系统 进程隔离:每 ...
- 这可能是最为详细的Docker入门吐血总结
这可能是最为详细的Docker入门吐血总结 https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...
- Docker入门 第一课 --.Net Core 使用Docker全程记录
微服务架构无疑是当前最火热的开发架构,而Docker作为微服务架构的首选工具,是我们必须要了解掌握的. 我通过一天的时间,网上查文档,了解基础概念,安装Docker,试验Docker命令,通过Dock ...
- Docker入门 .Net Core 使用Docker全程记录
https://www.cnblogs.com/flame7/p/9210986.html Docker入门 第一课 --.Net Core 使用Docker全程记录 微服务架构无疑是当前最火热的 ...
- 这可能是最为详细的Docker入门总结
写在前面 毕设是关于区块链的,自然就用到了docker,感觉到了docker的强大.学习源于总结,所以找了一些资料,这篇文章原作写的不错,看了好多遍哈哈. 这可能是最为详细的Docker入门总结 市面 ...
- 第三章 Docker 入门
第三章 docker 入门 3.1 确保docker已经就绪 首先查看docker程序是否存在,功能是否正常 [#3#cloudsoar@cloudsoar-virtual-machine ~]$su ...
- Docker入门教程(九)10个镜像相关的API
Docker入门教程(九)10个镜像相关的API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第九篇,重点介绍了镜像相关的Docker Remote ...
- Docker入门教程(八)Docker Remote API
Docker入门教程(八)Docker Remote API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第八篇,重点介绍了Docker Remote ...
- Docker入门教程(七)Docker API
Docker入门教程(七)Docker API [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第七篇,重点介绍了Docker Registry API和 ...
随机推荐
- Linux下添加自定义脚本到开机自启动,标准rpm,举例:设置Apache自启动
写一个脚本,名字为:autostart.sh,放在/etc/init.d/目录下,赋予权限chmod +x /etc/init.d/autostart.sh 代码如下 #!/bin/sh #chkco ...
- MFC窗口创建、销毁消息流程
MFC应用程序创建窗口的顺序 1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数,(可以设置窗口风格等等) 2.PreSubclassWindo ...
- python str与bytes之间的转换
# bytes object b = b"example" # str object s = "example" # str to bytes bytes(s, ...
- 《android开发艺术探索》读书笔记(六)--Drawable
接上篇<android开发艺术探索>读书笔记(五)--RemoteViews [BitmapDrawable] 简单的图片 <!xml version="1.0" ...
- hihoCoder 1288 Font Size 二分
题意:给定一个宽度为和高度为的屏幕,如果字体的大小为,那么一行可以显示个字,每一页可以显示行.给出段文本段落,每段有个文字,问现在能设置的最大字体并且总的页数不能超过? 思路:如果知道字体大小很容易求 ...
- 在SpringBoot中添加Logback日志处理
前言 SpringBoot项目中在官方文档中说明,默认已经依赖了一些日志框架.而其中推荐使用的就是Logback,所以这一次我将在我的模版中加入Logback日志的配置,说明一下,SpringBoot ...
- ReportView动态加载带参数的RDCL文件及子报表
本文来自Torres.Wu发表在博客园的博客,转载请标明出处. 同上一篇差不多,这次咱们加载带有子报表的RDCl文件.首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,l ...
- Ansible自动化运维笔记2(Ansible的组件介绍)
1.Ansible Inventory (1)静态主机文件 默认的ansible invetory是/etc/hosts文件,可以通过ANSIBLE_HOSTS环境变量或者通过运行命令的时候加上-i ...
- AfxBeginThread和CreateThread具体区别
1. 具体说来,CreateThread这个函数是windows提供给用户的 API函数,是SDK的标准形式,在使用的过程 中要考虑到进程的同步与互斥的关系,进程间的同步互斥等一系列会导致操作系统死锁 ...
- php xml DOM编码
PHP XML文件编程 一.PHP DOM编程 <?php //1.创建dom对象 $xmldoc=new DOMDocument(); //2.加载xml(指定对哪个xml文件进行操作) $x ...