Docker概述
Docker相对于虚拟机而言,Docker是更轻量的"虚拟机".
Docker本身不是容器,是创建容器的工具,是应用容器引擎:
Docker的概念:
- **“Build,Ship and Run:” ** 搭建、发送以及运行三板斧
- “Build once,Run anywhere:”(搭建一次,到处能用)
- “Docker技术的三大概念:”
- 镜像(Image):
- 容器(Container):
- 仓库(Repository):
(容器)docker基本指令
容器:
显示docker的基本情况(从客户端到服务器端两个方面介绍)
sudo docker info
创建并运行
基础镜像是容器创建必备的
创建交互式容器
sudo docker run -i -t 基础镜像
--name:指定容器的名字;注意容器的命名必须是唯一的
--restart:当容器发生某种错误时,Docker会检查容器的退出代码,决定是否重启
比如:--restart=always无论容器的退出代码是什么,都会自动重启
--restart=on-failure:当容器的退出代码为错误代码(非0)时就会自动重启
--restart=on-failure:n 当容器的退出代码为错误代码(非0)时就会自动重启,重启次数最多不超过n次
比如 sudo docker run -i -t ubuntu /bin/bash
以ubuntu基础镜像来创建容器,并运行/bin/bash命令启动了一个bash shell,如果本地镜像仓库不存在该镜像,则会从Docker Hub Rejistry中pull中镜像
然后在该容器中执行任何命令,想要退出容器则输入exit
创建守护式容器(没有交互式会话)
sudo docker run --name xxx -d 基础镜像 #创建一个容器名为xxx的基础镜像下的容器且该容器为守护式镜像。
--name:指定容器的名字;注意容器的命名必须是唯一的
--restart:当容器发生某种错误时,Docker会检查容器的退出代码,决定是否重启
比如:--restart=always无论容器的退出代码是什么,都会自动重启
--restart=on-failure:当容器的退出代码为错误代码(非0)时就会自动重启
--restart=on-failure:n 当容器的退出代码为错误代码(非0)时就会自动重启,重启次数最多不超过n次
例如:
docker run -d ubuntu bash -c “shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null”
会在ubuntu为基础镜像生成一个容器,容器中会执行命令bash -c
其中bash -c “string command” string command可以是命令或者一个可执行文件的绝对路径
bash -c命令含义
启动已经停止的容器
sudo docker start 容器名/容器ID
sudo docker restart 容器名/容器ID
管理
查看容器
sudo docker ps #只能看到正在运行的容器
sudo docker ps -a#会列出所有容器,包括正在运行的和已经停止的
sudo docker ps -l#会列出最后一次运行的容器,包括正在运行的和已经停止的
附着到容器上(首先该容器必须是交互式容器)
Docker容器重新启动的时候,会沿用docker run命令时指定的参数来运行。此时我们可以重新附上到该容器的会话上即交互shell上来控制容器
sudo docker attach 容器名/容器ID
查看容器的日志
sudo docker logs 容器名/容器ID
-f:追踪日志即实时更新
--tail:跟踪容器日志的某一个片段
-t:为每个日志项加上时间戳
查看容器内的所有进程
sudo docker top 容器名/容器ID
在容器内部运行进程
可以在容器内部额外启动新进程,可以在容器内运行的进程有两种类型:后台任务和交互式任务。
后台任务:
sudo docker exec -d 容器名/容器ID 命令
e.g:
sudo docker exec -d daemon-dave touch /etc/new_config_file
在daemon-dave容器中执行一个后台任务即创建一个空文件
打开一个shell的交互式会话
sudo docker exec -i -t 容器名/容器ID 命令
停止
对于交互式容器:
在会话中输入exit,则会退出该会话与此同时该容器也会停止
对于守护式容器:
sudo docker stop 容器名/容器ID
或者sudo docker kill 容器名/容器ID
删除
删除不需要的容器
sudo docker rm 容器名/容器ID
删除所有容器
sudo docker rm `docker ps -a -q`
(镜像)docker基本指令
查看所有镜像:
sudo docker images :我们已经获得一个镜像列表,
sudo docker images xxx:获得xxx仓库的镜像列表
镜像保存在仓库中,则仓库存在于Registry中。默认的Registry是由Docker公司运营的公共Registry服务,即Docker Hub
本地镜像保存在Docker宿主机的/var/lib/docker目录下。在/var/lib/docker/containers目录下看到所有的容器
拉取特定仓库的所有内容信息以及下载仓库镜像
sudo docker pull xxx:拉取xxx仓库的所有内容信息即下载仓库中的镜像
sudo docker pull xxx:yyy 拉取xxx仓库下标签为yyy的镜像
一个仓库下有不同镜像,Docker提供了一种称为标签(tag)的功能。我们可以通过在仓库名后面加上一个冒号和标签名来指定该仓库中的某一镜像
Docker Hub中有两种类型的仓库:用户仓库(user repository)和顶层仓库(top-level repository).
用户仓库的命名由用户名和仓库名两部分组成,如jamtur01/puppet;此时用户名为jamtur01,仓库名为puppet
构建镜像:
我们如何修改自己的镜像,并且更新和管理这些镜像呢?
一般来说,我们不是真正的“创建”新镜像,而是基于一个已有的基础镜像,如ubuntu或fedora等,构建新镜像而已。
编写Dockerfile之后使用docker build 命令
- 登录Docker Hub
sudo docker login
- Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中的指令构建一个新的镜像。
1. 先创建一个目录在该目录中书写Dockerfile文件;这个目录就是我们的构建环境。
Docker会在构建镜像时将构建上下文和该上下文中的文件或目录上传到Docker守护进程中
mkdir xxx
cd xxx
vim Dockerfile
2.书写Dockerfile文件
我们第一个Dockerfile文件
### Version:0.0.1
FROM ubuntu:14.04
MAINTAINER James Turnbull "james@example.com"
RUN apt update
RUN apt install -y nginx
RUN echo 'Hi,I am in your container'\
>/usr/share/nginx/html/index.html
EXPOSE 80
Dockerfile中的指令会按顺序从上到下执行,所以应该根据需要合理安排指令的顺序。
Dockerfile中的每条指令都是:指令名(全部大写) 参数
Docker大体上按照如下流程执行Dockerfile中的指令:
接下来我会详细介绍如何编写Dockerfile实现Go应用程序部署