我的Docker学习记录(一)

1、Docker的基本概念

这里概念大部分都是拿来主义,想要更详细的了解可以去官网或者搜索下

1.1、Docker简介

引用下百科的话:

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。

1.2、Docker基础概念

镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。

容器(Container): 镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。

仓库(Repository): 仓库可看着一个代码控制中心,用来保存镜像。

1.3、小结

这里我用自己的理解来说下,如果有不到位的可以交流下。

本人是个Javaer, 就以Java的角度来思考Docker的相关概念吧。首先,我们把Docker理解为JVM;可以把Repository暂时理解为我们的项目资源或者是Maven仓库吧,是存放镜像的集合;然后Image就是我们的Class文件,一个类的概念,模版的概念;而Container就可以理解为通过 new 出来的对象了。

其实Docker通过翻译是码头工人,而Container除了容器的意思外还有集装箱。这里也可认为Docker就是搬运,装载,卸载等功能,Container集装箱就是隔离各类货品(应用资源),它们有自己独立的空间和环境(例如Java环境来运行Java应用)。

就跟JVM一样,写了一份代码,只要与虚拟机挂钩,其他环境等都不需要管;Docker容器的隔离使得各类应用有自己的文件系统,可以做到互相不受影响。

好好想下,如果有一种平台可以直接拉取我们版本管理工具管理的代码,然后编译打包成Image文件,然后导入到Docker中。紧接着使用Docker通过镜像创建容器并且运行。那么我们从开发到部署整个过程就连起来且实现了自动化了(当然开发没有自动化。。)。其实这个也已经有了相应的软件来支撑了,Git、Jenkins、Rancher等等。


2、Docker的安装与运行

这里需要明确,本人系统是Ubuntu 16,安装的过程均基于此

2.1、Docker安装

安装Docker的方式存在多种,Docker提供了一种比较便利的方式供我们下载使用,这里只介绍脚本下载的方式

# 首先,确保已经安装了 curl , 键入命令查看是否存在, 如果不存在请先安装
curl -V 
##### 下载docker的安装脚本 #####
# 下载shell
curl -fsSL https://get.docker.com -o get-docker.sh
# 运行shell,这里加入阿里镜像下载,https://mirrors.aliyun.com/docker-ce
sudo sh ./get-docker.sh --mirror Aliyun

2.2、Docker服务相关配置

2.2.1、配置用户组及镜像链接

由于访问Docker需要sudo权限,这里将本登录用户加入docker用户组可以避免多次sudo的情况

sudo groupadd docker
sudo usermod -aG docker $USER

由于官网链接网速感人,一般需要配置镜像链接

sudo vim /etc/docker/daemon.json

这里我加入了两个镜像地址,如下

{
    "registry-mirrors": [
        "https://6kx4zyno.mirror.aliyuncs.com",
		"http://hub-mirror.c.163.com"
    ]
}

2.2.2、启动服务

# 设置Docker开机自启动
sudo systemctl enable docker
# 启动Docker服务
sudo systemctl start docker
# 测试是否成功
docker version

3、把玩Docker

这里有个建议,docker run --help ,遇到不知道的--help下,或者man docker .......

3.1、运行Redis

首先,需要拿到Redis镜像,然后利用Docker将Redis运行在容器中。

# 一般直接运行docker run docker会从本地镜像中查找,如果没有会直接在中央仓库查找并pull
# 这里演示下pull 下载Redis最新版,latest最新版,不指定默认latest
docker pull redis:latest
# 下载后即可命令容器运行Redis
# docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
docker run -d --rm --name redis-test-00 -p 1234:6379 redis:latest
# -d 就是--detach简写 后台运行容器并打印容器ID
# --rm 当容器退出时自动删除容器(一般容器停止时会保存当前容器,停止后可重新根据ID重启容器)**值得注意的是如果没有这个参数,那么容器会保留,可以通过docker start redis-test-00重启**
# --name string 当前要运行的容器的别名
# -p port:port ... ... 就是--publish简写 后面跟着端口映射list,用于配置宿主机与容器间的端口映射,这里将主机的1234端口与容器的6379端口进行映射(比如Tomcat启用8080端口在容器中运行,这里参数 -p 8090:8080, 这样主机localhost:8090即可访问)
# redis:latest 指定镜像名及版本号,如果版本是latest一般不用指明

# ***具体可通过 --help 查看***

# 运行成功后可通过ps查看,ps加入参数 --all可看所有的容器,包含已停止的
docker ps
# 可进入容器内部与其交互
docker exec -it redis-test-00 /bin/bash
# docker exec 在运行的容器中执行命令操作
# -it 其实是 -i -t; -i Keep STDIN open even if not attached 与其控制台保持交互, -t Allocate a pseudo-TTY 分配一个虚拟的终端;这里大概总是成双出现,一般理解为与容器终端交互即可吧。(个人理解)

# 现在进入与容器交互的模式了,可以直接在终端使用Redis
redis-cli
set k v
get k
del k
get k
....
# 退出可键入exit或 Ctrl+D
# 如果要停止当前的容器
docker stop redis-test-00

3.2、利用Dockerfile打包镜像

官方有个通过Dockerfile打包的例子,这里用这个来做实验,官方网址https://docs.docker.com/get-started/part2/

首先,先git一份官方的项目

git clone https://github.com/dockersamples/node-bulletin-board
cd node-bulletin-board/bulletin-board-app

然后再创建一个Dockerfile

touch Dockerfile
vim Dockerfile 

将以下内容复制进Dockerfile中


# Use the official image as a parent image
# 以此镜像作为基础,在此基础上打包成新的镜像
FROM node:current-slim

# Set the working directory
# 将此路径作为镜像运行在容器时的工作目录,例如使用docker exec进入容器,它的目录就是此目录了
WORKDIR /usr/src/app

# Copy the file from your host to your current location
# 将当前文件夹下的package.json 复制到工作目录下 容器中的/usr/src/app
COPY package.json .

# Run the command inside your image filesystem
# 在image打包前执行的命令, 由于npm速度慢,必要时可以后面加入  --registry=https://registry.npm.taobao.org
RUN npm install

# Inform Docker that the container is listening on the specified port at runtime.
# 容器运行时需要暴露的端口号码,项目中server.js 定义了监听端口8080,所以这里是将运行容器的8080暴露出来
EXPOSE 8080

# Run the specified command within the container.
# 在容器被运行后执行的命令
CMD [ "npm", "start" ]

# Copy the rest of your app's source code from your host to your image filesystem.
# 将当前主机所有文件夹下的所有东西copy到镜像,当然,我也不知道为什么不把这个放在前面,为什么要先COPY package.json后再COPY当前目录所有东西
COPY . .

# 这里按照我的个人理解是 在启动了镜像node:current-slim做为容器
# 然后再运行了此文件的RUN、COPY命令,并且将此运行的容器文件再打包作为我们要的镜像的基础文件

准备好后就可以使用docker build命令打包成image了

# 注意命令后有个 . ,这个点用于指明当前路径
docker build -t board-app:v3 .
# 这里的命令通过 --help查看下
# 主要格式为 docker build [OPTIONS] PATH | URL | -
# -t --tag的简写,后面标明构建镜像对象的名称及版本号,不指定版本号默认为latest
# 除了此参数,还可指定CPU,内存等等等的参数等,这个可以通过 docker build --help查看

执行了构建镜像命令后就可以运行容器了,

docker run -itd --rm --name board-app-1 -p 8080:8080 board-app:v3

通过访问 localhost:8080就可以看到web界面了。

关于以上的Dockerfile中的指令可以见这个 https://www.cnblogs.com/linjiqin/p/8735230.html

4、总结

总结下Docker的学习过程,别到时用到时完全忘了重新学习节奏太慢。
虽然很懒,不知什么时候就不会再写这种东西,但是现在写了,以后的事情再说吧。
Docker远远不止这些,求知之路任重而道远。

Docker相关链接
https://docs.docker.com/
http://www.ruanyifeng.com/blog/2018/02/docker-tutorial.html
https://www.cnblogs.com/linjiqin/p/8735230.html
https://www.runoob.com/docker/docker-tutorial.html

你可能感兴趣的:(我的Docker学习记录(一))