docker入门

目前在工作中十分流行DevOps,即开发运维“一体化”,同时伴随的就是很多便捷的运维工具,比如通过JenKins,Ansible,Docker这些,今天就整理了一下Docker相关的知识梳理。

什么是Docker?

Docker是一个开源项目,诞生于2013年初,最初是dotCloud公司内部的一个业余项目,它基于Google公司推出的Go语言实现。项目后来加入了Linux基金会,遵从了Apache2.0协议,项目代码在GitHub上进行维护。

我认为Docker 的出现一定是因为目前的后端在开发和运维阶段确实需要一种虚拟化技术解决开发环境和生产环境环境一致的问题,通过 Docker 我们可以将程序运行的环境也纳入到版本控制中,排除因为环境造成不同运行结果的可能。

Docker的组成部分

  1. Docker镜像(Images):Docker镜像是用于创建Docker容器的模板
  2. Docker容器(Container):容器是独立运行的一个或一组应用
  3. Docker客户端(Client):Docker客户端通过命令行或者其他工具使用Docker API与Docker守护进程通信
  4. Docker主机(Host):一个物理或者虚拟的机器用于执行Docker守护进程和容器
  5. Docker仓库(Registry):Docker仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub提供了庞大的镜像集合供使用。
  6. Docker Machine:Docker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令即可在相应的平台上安装Docker,比如VirturalBox、Digital Ocean、Microsoft Azure。

Docker和虚拟机比较

容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统层面上实现虚拟化,而传统的方式则是在硬件层面上实现的。
Alt Docker入门

Docker镜像与容器

镜像是构建Docker的基石。用户基于镜像来运行自己的容器,镜像也是Docker生命周期中的“构建部分”。镜像是基于联合文件系统的一种层式结构,由一系列指令一步一步构建出来。
其次Docker可以帮你构建和部署容器,你只需要把自己的应用程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运行一个或多个进程。

Docker的安装与启动

演示安装Docker的步骤,建议把Docker安装到CentOS7.x以上的版本。
(1)yum包更新到最新
sudo yum update
(2)安装需要的软件包,yum-util提供yum-config-manager功能,另外两个是devicemapper驱动依赖的
sudo yum install -y yum-utils device-mapper-persistent-date lvn2
(3)设置yum源为阿里云
sudo yum-config-manager --add repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
docker1.13 e为企业版,ce为社区版
(4)安装docker
sudo yum install docker-ce
(5)安装后查看docker版本
docker -v

设置USTC的镜像

ustc是老牌的linux镜像服务提供者了,usdc docker mirror的优势之一就是不需要注册,是真正的公共服务。https://lug.ustc.edu.cn/wiki/mirrors/help/docker
编辑该文件:
vi /etc/docker/daemon.json
在该文件中输入如下内容:
{"registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]}

Docker的启动与停止

systemctl命令是系统服务管理器指令
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
开机启动docker:systemctl enable docker

镜像相关命令

docker images REPOSITORY:镜像名称,TAG:镜像标签,IMAGE ID:镜像ID,CREATED:镜像的创建日期,SIZE:镜像大小
docker search 搜索镜像名称,NAME:仓库名称,DESCRIPTION:镜像描述,STARS:用户评价,OFFICIAL:是否官方,AUTOMATED:自动构建
docker pull 镜像名称 拉取下载镜像到本地
docker rmi 镜像ID 删除镜像

容器相关命令

docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker ps -l 查看最后一次运行的容器
docker ps -f status-exited 查看停止的容器

创建与启动容器

创建容器命令:docker run,-i:表示运行容器;-t:表示容器启动后会进入其命令行;-name:为创建的容器命名;-v:表示目录映射关系;-d:创建一个守护式容器在后台运行;-p:表示端口映射。
(1)交互式方式创建容器
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
(2)守护式方式创建容器
docker run -di --name=容器名称

部分应用部署

MySQL部署

(1) 拉取mysql镜像
docker pull centos/mysql-57-centos7
(2) 创建容器
docker run -di --name=tensquare_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root mysql
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root用户的登录密码
(3) 进入mysql容器
docker exec -it tensquare_mysql /bin/bash
(4) 登录mysql
mysql -uroot -p

Tomcat部署

(1) 拉取镜像
docker pull tomcat:7-jre7
(2) 创建容器
创建容器 -p 表示地址映射
docker run -di --name=mytomcat -p 9000:8000 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7

Nginx部署

(1) 拉取镜像
docker pull nginx
(2) 创建Nginx容器
docker run -di --name=mynginx -p 80:80 nginx
进入容器查看文件
docker exec -it mynginx /bin/bash
移动文件
docker cp html mynginx:/usr/share/nginx/

Redis部署

(1) 拉取镜像
docker pull redis
(2) 创建容器
docker run -di --name=myredis -p 6379:6379 redis
列出本地主机上的镜像
docker images

容器迁移与备份

容器保存为镜像

将容器保存为镜像
docker commit mynginx mynginx_1
将镜像保存为tar文件
docker save -o mynginx.tar mynginx_1
启动新镜像,81为宿主机端口
docker run -di --name=mynginx2 -p 81:80 mynginx_1

镜像的恢复与迁移

先停掉这个容器
docker stop mynginx2
删除这个容器
docker rm mynginx2
最后删除这个镜像
docker rmi mynginx_1
通过命令进行恢复
docker load -i mynginx.tar

Dockerfile

什么是Dockerfile

Dockerfile 是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像,有利于开发测试部署统一的环境。

常用命令

Alt Docker入门

Dockerfile 构建jdk8 镜像

创建目录:mkdir -p /usr/local/docker jdk8
构建Dockerfile 目录,vi Dockerfile

FROM centos:7     
MAINTAINER zz      
WORKDIR /usr      
RUN mkdir /usr/local/java     
ADD jdk8-linux.tar.gz /usr/local/java/     会自动解压     
ENV JAVA_HOME /usr/local/java/jdk1.8.0_171      
ENV JRE_HOME $JAVA_HOME/jre       
ENV CLASSPATH $JAVA_HOME/bin/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:CLASSPATH
ENV PATH $JAVA_HOME /bin:$PATH     

:wq保存,执行构建dockerfile,docker build -t-‘jdk1.8’