一、认识Docker

Docker是什么?

Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从 Apache2.0 协议开源。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。

容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

Docker的应用场景

Web 应用的自动化打包和发布。自动化测试和持续集成、发布。在服务型环境中部署和调整数据库或其他的后台应用。从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境。

Docker的优点

使用Docker,配置工作从资源管理中分离了出来,而部署工作则不值一提:执行docker run,环境的镜像会被拉取下来并准备运行,所消耗的资源更少并且是内含的,因此不会干扰其他环境。

Docker 架构

Docker 包括三个基本概念:

镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。

Docker 容器通过 Docker 镜像来创建。

容器与镜像的关系类似于面向对象编程中的对象与类。

二、Docker手动安装

前置文章:​​linux云服务器配置及Docker安装Mysql、Redis

Docker基本安装

#卸载旧版本

sudo apt-get remove docker docker-engine docker.io

# 安装包更新

sudo apt-get update

# 安装依赖

sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common

# 加Docker官方GPG key

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

#设置稳定版的Docker仓库

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

#安装 docker-ce

sudo apt-get install -y docker-ce

#查看是否安装成功

docker version

将用户加入 docker 用户组

出于安全考虑,一般 Linux 系统上不会直接使用 root 用户。

因此,更好地做法是将需要使用 docker 的用户加入 docker 用户组。

#建立 docker 组:

sudo groupadd docker

# 将当前用户加入 docker 组:

sudo usermod -aG docker $USER

#更新用户组

newgrp docker

#测试docker命令是否可以使用sudo正常使用

docker ps

三、Docker常用命令

Docker 命令大全

1、基础命令

docker version #查看docker的版本信息

docker info #查看docker的系统信息

docker 命令 --help #帮助命令(可查看可选的参数)

docker COMMAND --help

2、镜像命令

1.docker images:查看本地主机的所有镜像

#解释: 1.REPOSITORY 镜像的仓库源 2.TAG 镜像的标签 3.IMAGE ID 镜像的id 4.CREATED 镜像的创建时间 5.SIZE 镜像的大小 可选参数 - a/--all 列出所有镜像 - q/--quiet 只显示镜像的id

2.docker search:搜索镜像

docker search tomcat

3.docker pull 镜像名[:tag] :下载镜像

ubuntu@VM-8-4-ubuntu:~$ docker pull tomcat:8

8: Pulling from library/tomcat

9d19ee268e0d: Pull complete

f2b566cb887b: Pull complete

b375e6654ef5: Pull complete

19452d1108a6: Pull complete

b82f37793aff: Pull complete

05e2d15aa7f6: Pull complete

c13582f40375: Pull complete

Digest: sha256:f7ec6fbad076aeb902b8b3f0b13fa5296882759d7bd21d7ef7017c76c0bd4f20

Status: Downloaded newer image for tomcat:8

docker.io/library/tomcat:8

docker pull tomcat:9

4.docker rmi : 分层删除

docker rmi tomcat:9

docker rmi tomcat:8

docker rm 容器id #删除指定的容器,不能删除正在运行的容器 强制删除使用docker rm -f

5.docker ps : 列出当前正在运行的容器(※重要)

-a # 列出所有容器 用的非常多的一个参数 -n=? # 显示最近创建的n个容器 -q # 只显示容器的编号

6.docker start / docker stop 容器id :启动和停止容器命令

docker start 容器id #启动容器

docker restart 容器id #重启容器

docker stop 容器id #停止当前运行的容器

docker kill 容器id #强制停止当前容器(了解)

7.docker run:容器运行命令

Docker run 命令用来创建一个新的容器并运行,相当于 docker create和docker start的组合。

docker run [可选参数] image

#参数说明

--name="名字" 指定容器名字

-d 后台方式运行

-it 使用交互方式运行,进入容器查看内容

-p 指定容器的端口(-p ip:主机端口:容器端口 配置主机端口映射到容器端口-p 主机端口:容器端口-p 容器端口)

-p 3306:3306

-P 随机指定端口(大写的P)

先查看端口是否被占用

lsof -i:6379

docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes

8.docker logs 容器名:查看容器内部的日志

如果当前容器中得程序出现了一些bug, 此时会用docker logs 容器名 去查看容器内部的日志

9.docker top 容器名称:查看容器中进程信息

docker top 容器名称

10.docker exec : 进入当前正在运行的容器 (※重要)

docker exec 进入容器后开启一个新的终端,可以在里面操作

docker容器系统的重要特点: 如果当前容器系统中没有任何一个正在运行的程序, 该系统会被自动关机退出

输入exit后就会退出容器

-d :后台运行容器,并返回容器ID;-i :以交互模式运行容器,通常与 -t 同时使用;-t :为容器重新分配一个伪输入终端,通常与 -i 同时使用;-p: 指定端口映射,格式为:主机(宿主)端口:容器端口–name=“nginx-lb”: 为容器指定一个名称;–volume , -v: 绑定一个卷

具体使用详见本篇文章【四、数据卷安装mysql】

11.docker cp :用于容器与主机之间的数据拷贝

12.docker system df :查看docker镜像,容器,数据卷的磁盘占用情况

发现其中数据卷占用空间很大, 并且可回收空间也大,使用命令回收不再使用的数据卷

docker volume prune

三、Docker安装其他容器(普通安装)

1、使用docker安装mysql

注意:password 改为自己想要设置的数据库密码

docker run --name some-secret-mysql -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.7 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4 --sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

当2-3分钟之后, 输入docker ps 回车

查看到类似内容表示mysql安装成功

b8942c6f086a mysql:5.7 "docker-entrypoint.s…" 17 seconds ago Up 11 seconds 33060/tcp, 0.0.0.0:3307->3306/tcp, :::3307->3306/tcp some-secret-mysql

进入MySQL8

docker exec -it some-mysql8 bash

mysql -uroot -proot

mysql -uroot -pmimapassword

设置远程连接 navicate for mysql 远程连接

use mysql;

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';

FLUSH PRIVILEGES;

修改密码为永不过期

ALTER USER 'root'@'%' IDENTIFIED BY 'Jw1182-0c1' PASSWORD EXPIRE NEVER;

修改密码并指定加密规则为 mysql_native_password

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Jw1182-0c1';

刷新权限

FLUSH PRIVILEGES;

这样就可以远程连接数据库了;

ls /var/lib/mysql查看容器目录:数据库和数据卷存放在/var/lib/mysql目录下 同时云服务器需要保证已经开放了3306端口。 之后可以借助第三方工具去测试连接mysql。

关于数据卷安装mysql请看本篇文章【四、使用数据卷安装mysql(重要)】

2、使用docker安装redis

先查看端口是否被占用

lsof -i:6379

docker run --name some-redis -d -it -p 6379:6379 redis --requirepass "mimapassword" --appendonly yes

docker ps

关于Redis详见文章【redis】(一)使用docker安装redis、常用五大基本数据类型、Jedis操作Redis、Spring整合Redis

【redis】(二)docker安装redis、非docker安装,集群启动

3、使用docker安装clickhouse

docker run -dit --name some-clickhouse -e CLICKHOUSE_DB=test1 -e CLICKHOUSE_USER=root -e CLICKHOUSE_DEFAULT_ACCESS_MANAGEMENT=1 -e CLICKHOUSE_PASSWORD=password123 -p 9000:9000 -p 8123:8123 clickhouse/clickhouse-server

用户名root,密码password123,连接端口8123(记得防火墙开放端口) 关于clickhouse详见文章ClickHouse入门及安装、OLAP、列式数据库

四、使用数据卷安装(重要)

数据卷

注:因为mysql容器一旦销毁,数据库也就随之销毁,为了解决这个问题,docker官方提出了容器数据卷技术,就是在宿主机上新建一些目录与容器内的目录映射,当容器销毁时,宿主机上的目录文件不会消失,依然存在。

卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。

卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。

数据卷是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的数据卷 。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

数据卷的特点:

数据卷可在容器之间共享或重用数据卷中的更改可以直接生效数据卷中的更改不会包含在镜像的更新中数据卷的生命周期一直持续到没有容器使用它为止

无主的数据卷可能会占据很多空间,要清理请使用以下命令

$ docker volume prune

运行mysql容器,同时创建容器卷

docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4

–name some-mysql8: 为容器指定一个名称; –name some-mysql8:指定容器名字为some-mysql8,也可以不指定,不指定会给容器默认制定一个名字 -d: 后台运行容器,并返回容器ID; –volume , -v: 绑定一个卷 -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql:对宿主机数据库目录与容器数据库目录进行映射挂载。意思就是将mysql容器中的/var/lib/mysql(这个是数据库所有数据信息文件)映射到宿主机/it23/mysql8datadir里面。 -p: 指定端口映射,格式为:主机(宿主)端口:容器端口 将宿主机3306端口与容器3306端口做映射 -e : 设置环境变量;MYSQL_ROOT_PASSWORD为mysql的root用户设置密码。

查看容器对应元数据docker inspect 容器id,可以在Mounts节点查看建立的数据卷信息。

此时可以直接从宿主机查看到数据库222a里的内容

然后删除容器,宿主机中的相关文件夹依旧存有数据库 再次使用相同命令安装mysql8容器,重新安装之后,新数据库里面依旧会存有数据(此时数据库文件由宿主机→容器)

docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4

第一次,启动mysql容器时,宿主机的/it23/mysql8datadir是空的。是docker容器中的/var/lib/mysql会自动映射到宿主机/it23/mysql8datadir,让宿主机有了对应的文件信息。第二次,删除了docker容器,这时宿主机的/it23/mysql8datadir是有文件的。然后创建了mysql容器,并设置对应的映射关系。这时,宿主机的/it23/mysql8datadir文件映射到了容器中,保持数据一致。

当指定-v参数时,在启动容器时会首先检查宿主机中是否有数据文件:如果有的话,则判断是否是数据库文件,如果符合数据库文件系统的文件目录。那么则会使用;如果不符合数据库文件系统的文件目录,那么则会无法启动,直接报错。如果没有的话则会初始化数据库文件,生成一个干净的数据库系统并进行宿主机和docker容器间的互通。

根据匿名数据卷恢复数据

删除当前容器并且删除文件夹mysql8datadir,重新创建mysql8容器(不使用数据卷命令)。

docker run --name some-mysql8 -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4

在当前mysql容器中新建一个数据库newworld,并新建一张表sun,在表中插入一条数据来模拟旧的数据库数据。

匿名挂载就是在指定数据卷的时候,不指定容器路径对应的主机路径,这样对应映射的主机路径就是默认的路径/var/lib/docker/volumes/中自动生成一个随机命名的文件夹。

使用docker volume ls 查看所有的数据卷volume的情况, VOLUME NAME这里的值是真实存在的目录。

这些数据卷称为匿名数据卷,可以根据时间来选择数据卷,然后根据数据卷ID查看详细内容。

docker inspect 数据卷id 查看该数据卷的详细信息,找到数据卷所在文件夹。

切换到root用户然后访问数据卷所在文件夹。根据时间来选择数据卷

进入该目录下,发现有一个_data文件夹,再次切换到该文件夹里面进行查看,发现有刚刚创建的数据库newworld

使用pwd获取当前目录,然后切换回普通用户将该目录复制到新文件夹中。

sudo cp -r /var/lib/docker/volumes/b6aaa127bc2071bcc94c51b6fcc0be33ffa23c32f10d7ea20c586f84bad9d9cb/_data mysql8datadir

再次使用数据卷命令创建新的mysql8容器

docker run --name some-mysql8 -d -v /home/ubuntu/it23/mysql8datadir:/var/lib/mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=mimapassword mysql:8 --default_storage_engine=InnoDB --lower_case_table_names=1 --max_allowed_packet=50M --character-set-server=utf8mb4

匿名数据卷会占用一些磁盘空间,使用docker system df查看。

发现其中数据卷占用空间很大, 并且可回收空间也大,使用命令docker volume prune 回收不再使用的数据卷。

五、制作镜像

镜像制作

docker pull ubuntu:18.04

docker run --name some-jdk -dit ubuntu:18.04 /bin/bash

docker top some-jdk 发现此时运行了一个黑窗口程序 进入容器后查看当前系统版本uname -a 首先apt update -y

apt serach openjdk

安装jre-headless: apt install -y openjdk-8-jdk-headless

成功安装:java -version

生成镜像docker commit some-jdk yolo01/openjdk-jdk:8

查看镜像docker images 删除刚刚的容器

docker run --name some-jdk2 yolo01/openjdk-jdk:8 /bin/bash

推送到远程

登陆docker账号docker login

docker push yolo01/openjdk-jdk:8

相关阅读

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: