Docker

  • 初识 Docker
  • 安装
  • 第一次运行
  • 运行详解:
  • 仓库
  • 本地计算机可以拉取dockerhub上的镜像
  • 本地计算机的镜像可以推送到dockerhub的账户内
  • 镜像
  • 概念
  • 特点
  • 运行
  • 创建
  • 手动创建
  • 脚本创建
  • 容器
  • 概念
  • 特点
  • 运行
  • 再次打开已关闭的容器
  • 使用约束
  • Docker vs 虚拟机
  • Dockerfile编写
  • 编写思路
  • Dockerfile指令
  • 常用docker命令
  • Docker镜像(加快pull速度)


初识 Docker

Docker是实现容器技术的软件,用到了Linux内核的命名空间原理,故docker最适合在Linux上运行,现在能在Windows和Mac上运行是借助虚拟化技术创建Linux虚拟机实现的。

Docker有三个核心概念:容器、镜像、仓库

安装

#执行脚本简易安装 curl是用来发送http请求的,是利用URL语法在命令行下工作的文件传输工具
 $ sudo apt-get install curl
 $ curl -sSL https://get.daocloud.io/docker | sh
 $ systemctl start docker
 
 #修改添加当前用户到docker用户组,修改socket权限
 $ sudo usermod -aG docker dev
 $ sudo chmod 777 /var/run/docker.sock
 
 #退出终端后再次进入测试命令
 $ docker --help

第一次运行

$ docker run hello-world

运行详解:

The Docker client contacted the Docker daemon.  # 命令行连接到守护进程
The Docker daemon pulled the "hello-world" image from the Docker Hub (amd64)  # 守护进程发现当前没有hello-world镜像,于是去dockerhub下载了一个镜像
The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading.  # 守护进程基于hello-world镜像创建了一个容器,容器内有一个可执行程序,现在的内容都是由该程序输出的。
The Docker daemon streamed that output to the Docker client, which sent it to your terminal.  #  守护进程将容器的输出发送给命令行,也就是当前终端。

仓库

Docker官方设立了一个Docker镜像仓库:dockerhub,登录注册一个账号获得个人的repository

docker keyboard docker keyboard interrupt_docker

本地计算机可以拉取dockerhub上的镜像

#完整的docker镜像名称是 作者/镜像名:标签 如$ docker pull ubuntu/ubuntu:latest  拉取ubuntu账号下的最新版本的ubuntu
 $ docker pull ubuntu:latest  #这里不写作者,不用登陆即可下载

若想拉取其他镜像如centos,可以在dockerhub上先搜索centos

docker keyboard docker keyboard interrupt_ubuntu_02


进入官方页面之后,可以搜索tag来找到特定的版本,比如我搜索7.5

docker keyboard docker keyboard interrupt_docker_03

本地计算机的镜像可以推送到dockerhub的账户内

#登录,按照提示输入dockerhub的用户名密码
 $ docker login
 
 # 将本地镜像重命名成规范名称
 $ docker tag ubuntu marklion/ubuntu:myfirsttag
 
 # 推送自己的镜像
 $ docker push marklion/ubuntu:myfirsttag

镜像的修改,提交等操作很类似git和github的操作。

镜像

概念

一组环境的静态集合,类似操作系统镜像。

特点

docker镜像像有分层依赖的关系。创建镜像的过程就好像写代码,从简单到复杂的过程。

docker keyboard docker keyboard interrupt_docker keyboard_04

运行

镜像运行后会产生容器。基于一个镜像可以运行多个容器。

#查看当前所有的镜像
$ docker images

#运行ubuntu镜像:在ubuntu容器中执行一条ls的命令,不写命令则运行bash
$ docker run --rm -ti ubuntu ls

# --rm:运行结束后删除容器  -ti:提供虚拟终端和交互式界面

创建

类似基于原始系统搭环境

手动创建

a.下载并运行基础镜像

b.进入基础镜像的容器内安装所需环境

c.将容器提交为镜像

# 直接执行ifconfig,报错,因为基础镜像没有安装ifconfig包
$ docker run --rm ubuntu ifconfig
docker: Error response from daemon: OCI runtime create failed: container_linux.go:344: starting container process caused “exec :\"ifconfig\"
ERRO[0000] error waiting for container: context canceled

# 进入基础镜像.安装工具包后退出
$ docker run -ti ubuntu

# apt-get update
# apt-get install -y net-tools
# exit


# 找到刚才的容器,基于其创建镜像
$ docker ps -a
CONTAINER ID 		IMAGE 		C0W4AND			 CREATED 			STATUS		 				PORTS  	NAME
034abada670c 	   ubuntu     	"/bin/bash"		31 minutes ago	 	Exited (0) 20 seconds ago

# commit命令用于容器--->镜像。 容器ID可以用简写
$ docker commit 034a my_ubuntu:add_net
$ docker images
REPOSITORY			TAG			IMAGE ID			CREATED			SIZE
my_ubuntu			add_net		6ca02b1d0483		5 seconds ago	114MB

# 用新镜像运行ifconfig
$ docker run --rm my_ubuntu:add	ifconfig
# 成功运行

脚本创建

a.编写Dockerfile

b.运行docke编译命令

# Dockerfile中定义基础镜像,和要运行的安装命令
$ cat Dockerfile
FROM ubuntu
RUN apt-get update
RUN apt-get install -y net-tools

# 编译镜像,指定镜像名是df_unbutu:add_net,指定Dockerfile所在目录是当前目录
$ docker build -t df_unbutu:add_net .

容器

概念

运行中的一组环境。基于某个镜像创建。

特点

容器中要运行程序,最好只运行一个程序。容器的运行不会影响镜像内容。

运行

  • -d支持以后台模式运行进程 $ docker run -d ubuntu # -d后台模式运行容器
  • -p支持将容器内的端口映射到宿主机 docker run -p 80:80 -v /data:/data -d nginx:latest
  • -v支持以挂载(mount)的形式和宿主机共享文件系统 docker run -p 80:80 -v /data:/data -d nginx:latest
  • 容器运行的程序exit退出后,容器随之退出,当然,容器退出后可以再次打开

再次打开已关闭的容器

# 找到需要重启的容器的container ID
$ docekr ps -a 
# 重启container
$ docker start xxxx
# 打开容器
$ docekr attach xxxx

使用约束

  • docker官方推荐,一个容器最好只运行一个进程
  • 镜像和容器会占用磁盘空间,好习惯:删除不用的容器和镜像。

Docker vs 虚拟机

相似:

  • 都通过镜像包装
  • 都起到隔离运行环境的作用

区别:

-

Docker

虚拟机

速度

快(基于当前系统创建不同上下文)

慢(启动操作系统)

体量

小(镜像自由剪裁)

大(依赖厂商)

分发

容易(dockerhun、Dockerfile)

困难(依赖厂商分发)

复杂度

简单(对于操作系统只是一个程序)

复杂(要考虑资源的分配、与宿主机通信等)

独立性

较好(只能基于端口独立)

非常好(跟真实主机几乎无区别)

Dockerfile编写

docker keyboard docker keyboard interrupt_docker_05

编写思路

  • 确定基础镜像
  • 安装所需环境
  • 定义执行点

Dockerfile如下:

FROM ubuntu
RUN apt-get update
RUN apt-get install -y gcc
ENTRYPOINT ["gcc"]

注意:有几个RUN就会有几层镜像,镜像层次过多会膨胀过大,可以如下通过\ 和 &&只构建一层镜像:

FROM ubuntu
RUN apt-get update \
    && apt-get install -y gcc
ENTRYPOINT ["gcc"]

构建镜像

$ docker build -t my_gcc

运行镜像

# 由于Dockerfile中设置了执行点是gcc,所以镜像my_gcc后面所有内容都是gcc参数
$ docker run -v /home/dev/:/root/host/ my_gcc /root/host/tcp_echo.c -o /root/host/tcp_echo

Dockerfile指令

指令

描述

FROM 本地镜像名或者dockerhub镜像名

指定基础镜像

MAINTAINER 作者<邮箱>

注明作者和邮箱

COPY 主机文件路径 容器内路径

复制指令,从上下文目录中复制文件或者目录到容器里指定路径,主机文件路径必须使用dockerfile所在路径的相对路径

RUN 命令

构建镜像过程中执行的命令,一条构建一层镜像

EXPOSE 端口号

定义要映射到主机的端口号,搭配run命令的-P参数可以随机映射

ENTYRPOINT

定义镜像执行点,定义后,run命令最后的字段会变成该执行点的参数

CMD [“命令或参数”]

若没有定义执行点,则该命令定义的是镜像创建后缺省的指向程序。若定义了执行点,则该命令定义的是执行点的参数。run命令的最后字段会替换该命令的值。

常用docker命令

$ docker images # 查看本地docker仓库中的镜像情况
$ docker ps -a # 列出正在运行的容器 -a包括未运行的
$ docker run -ti ubuntu /bin/bash  # -ti是启动一个伪输入终端并以交互模式运行
$ docker run -d	ubuntu  # -d后台模式运行容器

https://www.runoob.com/docker/docker-run-command.html

Docker镜像(加快pull速度)

{
“registry-mirrors”: [
“https://9cpn8tt6.mirror.aliyuncs.com”,
“https://8bhew391.mirror.aliyuncs.com”,
“https://almtd3fa.mirror.aliyuncs.com”,
“https://hccwwfjl.mirror.aliyuncs.com”,
“https://registry.docker-cn.com”,
“http://hub-mirror.c.163.com”
]
}
写入/etc/docker/daemon.json

systemctl daemon-reload
systemctl restart docker