docker基础安装使用

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: docker基础安装使用

一、简介

1、虚拟化

Docker 是⼀个开源项⽬,诞⽣于 2013 年初,最初是 dotCloud 公司内部的⼀个业余项⽬。它基于 Google 公司推出的 Go 语⾔实现。 项⽬后来加⼊了 Linux 基⾦会,遵从了 Apache 2.0 协议,项⽬代码在 GitHub 上进⾏维护。

为什么选择Docker?

  • (1)上⼿快。

⽤户只需要⼏分钟,就可以把⾃⼰的程序“Docker化”。Docker依赖于“写时复制”(copy-on-write)模型,使修改应⽤程序也⾮常迅速,可以说达到“随⼼所致,代码即改”的境界。随后,就可以创建容器来运⾏应⽤程序了。⼤多数Docker容器只需要不到1秒中即可启动。由于去除了管理程序的开销,Docker容器拥有很⾼的性能,同时同⼀台宿主机中也可以运⾏更多的容器,使⽤户尽可能的充分利⽤系统资源。

  • (2)职责的逻辑分类

使⽤Docker,开发⼈员只需要关⼼容器中运⾏的应⽤程序,⽽运维⼈员只需要关⼼如何管理容器。Docker设计的⽬的就是要加强开发⼈员写代码的开发环境与应⽤程序要部署的⽣产环境⼀致性。从⽽降低那种“开发时⼀切正常,肯定是运维的问题(测试环境都是正常的,上线后出了问题就归结为肯定是运维的问题)”

  • (3)快速⾼效的开发⽣命周期

Docker的⽬标之⼀就是缩短代码从开发、测试到部署、上线运⾏的周期,让你的应⽤程序具备可移植性,易于构建,并易于协作。(通俗⼀点说,Docker就像⼀个盒⼦,⾥⾯可以装很多物件,如果需要这些物件的可以直接将该⼤盒⼦拿⾛,⽽不需要从该盒⼦中⼀件件的取。)

  • (4)⿎励使⽤⾯向服务的架构

Docker还⿎励⾯向服务的体系结构和微服务架构。Docker推荐单个容器只运⾏⼀个应⽤程序或进程,这样就形成了⼀个分布式的应⽤程序模型,在这种模型下,应⽤程序或者服务都可以表示为⼀系列内部互联的容器,从⽽使分布式部署应⽤程序,扩展或调试应⽤程序都变得⾮常简单,同时也提⾼了程序的内省性。(当然,可以在⼀个容器中运⾏多个应⽤程序)

2、Docker组件

2.1 Docker服务器与客户端

Docker是⼀个客户端-服务器(C/S)架构程序。Docker客户端只需要向Docker服务器或者守护进程发出请求,服务器或者守护进程将完成所有⼯作并返回结果。Docker提供了⼀个命令⾏⼯具Docker以及⼀整套RESTful API。你可以在同⼀台宿主机上运⾏Docker守护进程和客户端,也可以从本地的Docker客户端连接到运⾏在另⼀台宿主机上的远程Docker守护进程。

  • 服务端(server):Docker守护进程,负责处理Docker指令,管理镜像、容器等
  • 客户端(client):通过命令或RestAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令。

2.2 Docker镜像与容器

Docker中有几个重要的概念:

镜像(Image):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像。

容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器进程做隔离,对外不可见。

  镜像是构建Docker的基⽯。⽤户基于镜像来运⾏⾃⼰的容器。镜像也是Docker⽣命周期中的“构建”部分。镜像是基于联合⽂件系统的⼀种层式结构,由⼀系列指令⼀步⼀步构建出来

  Docker可以帮助你构建和部署容器,你只需要把⾃⼰的应⽤程序或者服务打包放进容器即可。容器是基于镜像启动起来的,容器中可以运⾏⼀个或多个进程。我们可以认为,镜像是Docker⽣命周期中的构建或者打包阶段,⽽容器则是启动或者执⾏阶段。 容器基于镜像启动,⼀旦容器启动完成后,我们就可以登录到容器中安装⾃⼰需要的软件或者服务。

  Docker也不关⼼你要把容器运到何⽅:我们可以在⾃⼰的笔记本中构建容器,上传到Registry,然后下载到⼀个物理的或者虚拟的服务器来测试,在把容器部署到具体的主机中。像标准集装箱⼀样,Docker容器⽅便替换,可以叠加,易于分发,并且尽量通⽤。

2.3 Registry(注册中⼼)

  Docker⽤Registry来保存⽤户构建的镜像。Registry分为公共和私有两种。Docker公司运营公共的Registry叫做Docker Hub。⽤户可以在Docker Hub注册账号,分享并保存⾃⼰的镜像(说明:在Docker Hub下载镜像巨慢,可以⾃⼰构建私有的Registry)。

https://hub.docker.com/

开源应用程序非常多,打包这些应用往往是重复的劳动。为了避免这些重复劳动,人们就会将自己打包的应用镜像,例如Redis、MySQL镜像放到网络上,共享使用,就像GitHub的代码共享一样。

  • DockerHub:DockerHub是一个官方的Docker镜像的托管平台。这样的平台称为Docker Registry。
  • 国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务阿里云镜像库等。

我们一方面可以将自己的镜像共享到DockerHub,另一方面也可以从DockerHub拉取镜像:

3、小结

Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?

  • Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
  • Docker应用运行在容器中,使用沙箱机制,相互隔离

Docker如何解决开发、测试、生产环境有差异的问题?

  • Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内核,因此可以在任意Linux操作系统上运行

Docker是一个快速交付应用、运行应用的技术,具备下列优势:

  • 可以将程序及其依赖、运行环境一起打包为一个镜像,可以迁移到任意Linux操作系统
  • 运行时利用沙箱机制形成隔离容器,各个应用互不干扰
  • 启动、移除都可以通过一行命令完成,方便快捷

4、Docker和虚拟机的区别

Docker可以让一个应用在任何操作系统中非常方便的运行。而以前我们接触的虚拟机,也能在一个操作系统中,运行另外一个操作系统,保护系统中的任何应用。

两者有什么差异呢?

虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行 Ubuntu 系统,这样就可以运行任意的Ubuntu应用了。

Docker仅仅是封装函数库,并没有模拟完整的操作系统,如图:

对比来看:

小结:

Docker和虚拟机的差异:

  • docker是一个系统进程;虚拟机是在操作系统中的操作系统
  • docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般

二、安装Docker

1、安装docker

yum 包更新到最新

yum update

安装需要的软件包

yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的

yum install -y yum-utils device-mapper-persistent-data lvm2

设置yum源为阿⾥云

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装docker

yum install docker-ce

查看docker版本

docker -v

2、设置ustc的镜像

ustc是⽼牌的linux镜像服务提供者了,还在遥远的ubuntu 5.04版本的时候就在⽤。ustc的docker镜像加速器速度

很快。ustc docker mirror的优势之⼀就是不需要注册,是真正的公共服务。

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

https://lug.ustc.edu.cn/wiki/mirrors/help/docker

编辑该⽂件(本身没有该文件,编辑后即可添加):

vim /etc/docker/daemon.json

在该⽂件中输⼊如下内容:

{
  "registry-mirrors": [
    "https://docker.mirrors.ustc.edu.cn"
  ]
}

3、docker的启动与停止

启动/停止docker

# 启动docker
systemctl start docker
# 停止docker
systemctl stop docker
# 重启docker
systemctl restart docker
# 查看docker状态
systemctl status docker

开机启动docker

systemctl enable docker

查看docker概要信息

docker info

查看docker帮助文档

docker --help

三、常用命令

1、镜像相关命令

1.1 查看镜像
docker images

  • REPOSITORY:镜像名称。
  • TAG:镜像标签。
  • IMAGE ID:镜像ID。
  • CREATED: 镜像的创建⽇期(不是获取该镜像的⽇期)。
  • SIZE: 镜像⼤⼩。

这些镜像都是存储在Docker宿主机的/var/lib/docker⽬录下

1.2 搜索镜像

从网路中搜索镜像

docker search 镜像名称
docker search mysql
  • NAME: 仓库名称
  • DESCRIPTION: 镜像描述
  • STARS: ⽤户评价,反应⼀个镜像的受欢迎程度
  • OFFICIAL: 是否官⽅
  • AUTOMATED: ⾃动构建,表示该镜像由Docker Hub⾃动构建流程创建的
1.3 拉取镜像

从中央仓库下载镜像到本地

docker pull 镜像名称
docker pull mysql
1.4 删除镜像

根据镜像ID删除镜像

docker rmi 镜像ID

删除所有镜像

docker rmi 'docker images -q'

2、容器相关命令

2.1 容器内容查看

查看正在运行容器

docker ps

查看所有容器

docker ps -a

查看最后一次运行的容器

docker ps -l

查看停止的容器

docker ps -f status=exited
2.2 查看容器详情
docker container inspect 8e62a22b080b

2.3 创建与启动容器

创建容器命令:docker run

docker run=docker create+docker start

  • -i: 表示运⾏容器
  • -t: 表示容器启动后会进⼊其命令⾏。加⼊这两个参数后,容器创建就能登录进去。即分配⼀个伪终端。
  • –name: 为创建的容器命名。
  • -v: 表示⽬录映射关系(前者是宿主机⽬录,后者是映射到宿主机上的⽬录),可以使⽤多个-v做多个⽬录或⽂件映射。注意:最好做⽬录映射,在宿主机上做修改,然后共享到容器上。
  • -d: 在run后⾯加上-d参数,则会创建⼀个守护式容器在后台运⾏(这样创建容器后不会⾃动登录容器,如果只加-i -
  • -p: 表示端⼝映射,前者是宿主机端⼝,后者是容器内的映射端⼝。可以使⽤多个-p做多个端⼝映射t两个参数,创建后就会⾃动进去容器)。

1. 交互式创建容器

docker run -it --name=容器名称 镜像名称:标签 /bin/bash

退出容器

exit

2. 守护式方式创建容器

docker run -di --name=容器名称 镜像名称:标签
# 启动Redis
docker run -di --name=myredis -p 6379:7379 redis

登录守护式容器方式

docker exec -it 容器名称(或容器ID) /bin/bash
# 登录 redis
docker exec -it 35f3bf9a06ef /bin/bash
2.4 启动和停止容器

启动容器

docker start 容器名称(或者容器ID)
# 启动Redis
docker start 35f3bf9a06ef

停止容器

docker stop 容器名称(容器ID)
# 停止Redis
docker stop 35f3bf9a06ef
2.5 文件拷贝

文件拷贝到容器中

docker cp 需要拷贝文件/目录 容器名称:容器目录

容器中文件拷贝出来

docker cp 容器名称:容器目录 拷贝后文件/目录
2.6 查看容器IP地址
docker inspect 容器名称(容器ID)
# 查看Redis的ID
docker inspect 35f3bf9a06ef

直接输出ID

docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(容器ID)
# 获取指定IP
docker inspect --format='{{.NetworkSettings.IPAddress}}' 35f3bf9a06ef
2.7 删除容器
docker rm 容器名称(容器ID)
# 先停止容器、然后删除
docker stop 35f3bf9a06ef
docker rm 35f3bf9a06ef
2.8 导入容器

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。

docker export -o my.tar 8e62a22b080b

2.9 导入容器

将导出的容器导入之后会成为镜像。

docker import my.tar -- test01:1.1.1.1

2.10 查看统计信息

会显示 CPU 、内存、存储、网络等使用情况的统计信息


         

2.11 查看容器内进程

这个子命令类似于 Linux 系统中的 top 命令, 会打印出容器内的进程信息, 包括 PID 、 用户、时间、命令等。

docker top 8e62a22b080b

四、常见应用部署

1、MySQL部署

拉取MySQL镜像

docker pull centos/mysql-57-centos7

创建容器

docker run -di --name=tensquare_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7
  • -p :代表端⼝映射,格式为 宿主机映射端⼝:容器运⾏端⼝
  • -e: 代表添加环境变量 MYSQL_ROOT_PASSWORD 是root⽤户的登陆密码

2、Tomcat部署

拉取Tomcat

docker pull tomcat

创建容器

docker run -di --name=mytomcat -p 8080:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat

3、Nginx部署

docker pull nginx

创建Nginx容器

docker run -di --name=mynginx -p 80:80 nginx

4、Redis部署

docker pull redis

创建容器

docker run -di --name=myredis -p 6379:6379 redis

五、数据备份和迁移

1、容器持久化为镜像

将运行中容器持久化为镜像

# 查看在运行容器
docker ps
# 持久化Tomcat
docker commit 78a69ea6da3a mytomcat_1

2、镜像备份

docker save -o [保存的目标文件名称] [镜像名称]

将镜像保存为tar文件

# 查看镜像(1中容器持久化的镜像)
docker images
# 保存为本地文件(mynginx.tar)
docker save -o /data/mynginx.tar mytomcat_1

3、加载镜像文件

将保存到本地的镜像文件,加载到docker中

# 加载镜像
docker load -i mynginx.tar

六、自定义镜像部署(Dockerfile)

1、资源准备

下载JDK

wget https://codechina.csdn.net/weixin_44624117/software/-/raw/master/software/jdk-8u181-linux-x64.tar.gz

配置Docker打包配置文件:Dockerfile

# 指定基础镜像
FROM centos:8
# 拷贝jdk和java项目的包
COPY ./demo-docker.jar /tmp/app.jar
COPY ./jdk-8u181-linux-x64.tar.gz /tmp/jdk-8u181-linux-x64.tar.gz
# 配置环境变量
RUN cd /tmp \
 && tar -zxvf /tmp/jdk-8u181-linux-x64.tar.gz  -C /tmp
# 配置环境变量
ENV JAVA_HOME=/tmp/jdk1.8.0_181
ENV PATH=$PATH:$JAVA_HOME/bin
# 暴露端口
EXPOSE 8080
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar

创建Java项目并打包

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class Test {
    @RequestMapping("/test")
    public String get() {
        System.out.println("test");
        return "test";
    }
}

打包后的jar包路径

https://download.csdn.net/download/weixin_44624117/86862162

配置完成后文件,完整文件(JDK+Jar+Dockerfile)

https://download.csdn.net/download/weixin_44624117/86862417

2、发布镜像

自定义发布到docker容器中

docker build -t docker_test:1.0 .

运行docker镜像

docker run -di --name=my_docker -p 8080:8080 e6bf70c38c35 /bin/bash

3、测试

curl http://localhost:8080/test/test

4、容器配置JDK环境

编写Dockerfile文件

FROM centos:7.5.1804
RUN mkdir -p /opt/module
RUN mkdir -p /opt/software
COPY jdk-8u181-linux-x64.tar.gz /opt/software
RUN tar -zxvf /opt/software/jdk-8u181-linux-x64.tar.gz -C /opt/module
RUN rm -rf /opt/software/jdk-8u181-linux-x64.tar.gz
ENV JAVA_HOME=/opt/module/jdk1.8.0_181
ENV PATH=$JAVA_HOME/bin:$PATH

构建镜像

docker build -t centos_java8:1.0.0 /root

5、为4添加ssh服务

Dockerfile文件

# 设置继承镜像
FROM centos:7.5.1804
RUN mkdir -p /opt/module
RUN mkdir -p /opt/software
COPY jdk-8u181-linux-x64.tar.gz /opt/software
RUN tar -zxvf /opt/software/jdk-8u181-linux-x64.tar.gz -C /opt/module
RUN rm -rf /opt/software/jdk-8u181-linux-x64.tar.gz
ENV JAVA_HOME=/opt/module/jdk1.8.0_181
ENV PATH=$JAVA_HOME/bin:$PATH
# 提供作者信息
MAINTAINER atguigu_lzc (lizhenchao@atguigu.com)
# 更换国内阿里云yum源
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
RUN sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
RUN yum makecache
# 安装sshd
RUN yum install -y openssh-server openssh-clients
RUN sed -i '/^HostKey/'d /etc/ssh/sshd_config
RUN echo 'HostKey /etc/ssh/ssh_host_rsa_key'>>/etc/ssh/sshd_config
# 生成 ssh-key
RUN ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_rsa_key
# 更改 root 用户登录密码为
RUN echo 'root:aaaaaa' | chpasswd
# 开发 22 端口
EXPOSE 22
# 镜像运行时启动sshd
RUN mkdir -p /opt
RUN echo '#!/bin/bash' >> /opt/run.sh
RUN echo '/usr/sbin/sshd -D' >> /opt/run.sh
RUN chmod +x /opt/run.sh
CMD ["/opt/run.sh"]

构建镜像

docker build -t centos_java_sshd:1.0 ./
docker images

运行容器

docker run -d -p 2222:22 515c6e742c17

登录测试

ssh root@localhost -p 2222

目录
相关文章
|
Ubuntu Linux C语言
还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点
一般情况下,当你想为你的Python开发环境选择一个基础镜像时,大多数人都会选择Alpine,为什么?因为它太小了,仅仅只有 5 MB 左右(对比 Ubuntu 系列镜像接近 100 MB),但事实的真相是,我们选择基础镜像并不是为了体验一下Python语法而已,在此基础上,我们需要调试和安装各种扩展,可能会安装很多三方依赖,甚至预设更多服务,在这种环境下,Alpine就并非是一个很好的选择了,本次我们就来分别在Alpine和Ubuntu上来体验一下安装和编译Python的区别。
还在用Alpine作为你Docker的Python开发基础镜像?其实Ubuntu更好一点
|
1月前
|
Oracle 关系型数据库 Linux
Docker入门和安装
这篇文章提供了Docker的入门指南和在CentOS系统上安装Docker的详细步骤。
39 0
Docker入门和安装
|
3月前
|
存储 Ubuntu Linux
如何安装和使用 Docker:入门指南
如何安装和使用 Docker:入门指南
170 1
|
6月前
|
Linux iOS开发 Docker
Docker多平台安装
Docker多平台安装
74 0
|
11月前
|
存储 Ubuntu Docker
docker环境安装
docker环境安装
159 0
|
Ubuntu NoSQL Linux
一文讲明Docker的基本使用,常见Docker命令使用 、Docker的安装使用等
1、Docker的基本概念 2、常用的Docker命令 3、虚拟机安装Docker
|
NoSQL 应用服务中间件 API
Docker简介及安装
Docker简介及安装
135 1
Docker简介及安装
|
Linux iOS开发 Docker
docker到底能在哪些平台安装?
docker到底能在哪些平台安装?
docker到底能在哪些平台安装?
|
存储 Linux Docker
Docker学习(一)安装
Docker学习(一)安装
|
数据可视化 Shell Docker
Docker系列教程13-Docker可视化管理工具
原文:http://www.itmuch.com/docker/13-docker-visualization 本节介绍几款Docker可视化管理工具。
7413 0