chaoz的杂货铺

生命有息、学无止境、折腾不止

0%

Docker初识

Docker 入门

Docker解决的是服务器应用快速构建、部署和分享的问题,他能将服务器应用像APP一样简单地部署到各种平台环境中,而不受真实环境的影响。

与Hadoop区别:解决的是分布式计算问题,他提供一套分布式存储和计算的解决方案,而且这个方案很廉价很高效。

三个核心概念:容器、镜像、Docker Hub

容器:提供一个隔离的安全运行环境,是的不同应用质检不会互相干扰。

镜像:容器的静态存在方式。

Docker Hub:一个公共的镜像平台,为镜像分享提供便利。用户可以根据自己的需要,在已有镜像的基础上定制自己的镜像。

Docker通俗介绍

Docker就像一个打包器,可以把你的应用及其环境整体打包,然后很方便地迁移到不同的平台,到处运行。

当一个应用拥有复杂的软件依赖关系和多种多样的硬件运行环境和多样的硬件运行环境时,有以下几个问题必须面对:

能否处理应用依赖的多样性和依赖库之间的不良反应?
能否能够适应硬件环境的多样性?
服务和应用之间的交互是否合理?
是否可以在多个平台之间快捷移动?

什么是Docker

Docker容器引擎;该引擎可以让开发者打包他们的应用和依赖包到任何一个可一直的容器中,然后将其发布到任何流行的Linux机器上。
Docker Hub注册服务器:用户可以在该服务器上创建自己的镜像来存储、管理和分享镜像。利用Docker,可实现软件的一次配置、处处运行。

容器与虚拟机

虚拟机不陌生,基于硬件的虚拟技术,指令级的虚拟,完全虚拟一套物理主机。
Docker:进程级别的隔离,让每个容器都想运行在单独的系统之上,但又能狗共享很多底层资源。轻量、快速、易于管理。

Docker的安装

本文开发环境为Ubuntu 16.04 LTS 64位系统,通过apt的docker官方源安装最新的Docker CE(Community Edition),即Docker社区版,是开发人员和小型团队的理想选择。

开始安装

由于apt官方库里的docker版本可能比较旧,所以先卸载可能存在的旧版本:

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

更新apt包索引:

$ sudo apt-get update

安装以下包以使apt可以通过HTTPS使用存储库(repository):

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

添加Docker官方的GPG密钥:

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

使用下面的命令来设置stable存储库:

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

再更新一下apt包索引:

$ sudo apt-get update

安装最新版本的Docker CE:

$ sudo apt-get install -y docker-ce

在生产系统上,可能会需要应该安装一个特定版本的Docker CE,而不是总是使用最新版本:
列出可用的版本:

$ apt-cache madison docker-ce

image.png

选择要安装的特定版本,第二列是版本字符串,第三列是存储库名称,它指示包来自哪个存储库,以及扩展它的稳定性级别。要安装一个特定的版本,将版本字符串附加到包名中,并通过等号(=)分隔它们:

$ sudo apt-get install docker-ce=18.03.1~ce-0~ubuntu
验证docker 查看docker服务是否启动:
$ systemctl status docker

若未启动,则启动docker服务:

$ sudo systemctl start docker

经典的hello world:

$ sudo docker run hello-world

image.png

有以上输出则证明docker已安装成功!

获取mysql官方最新docker镜像

$ sudo docker pull mysql/mysql-server:latest

耐心等待下载,完成后可以通过以下命令查看下载的镜像:

$ sudo docker images

创建并启动mysql服务容器

创建一个文件夹用于挂载mysql数据库文件

$ sudo mkdir /docker/mysql_data -p

生成mysql容器

$ sudo docker run --name mysql -d --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql_data:/var/lib/mysql mysql/mysql-server

其中,–name mysql:容器指定名称为mysql;-d:后台运行容器,并返回容器ID;–restart always:在容器退出时总是重启容器;-p 3306:3306:将宿主机的3306端口(前者)映射到容器的3306端口(后者);-e MYSQL_ROOT_PASSWORD=123456:设置mysql的root密码为123456;-v /docker/mysql_data:/var/lib/mysql:将宿主机的目录/docker/mysql_data映射到容器的目录/var/lib/mysql,用于存放容器的mysql数据库文件。

查看容器启动状态

查看已经创建的容器:

$ sudo docker ps -a

查看已经启动的容器:

$ sudo docker ps -s

若容器未启动,则通过以下命令启动:

$ sudo docker start mysql

其中mysql是容器名称,也可以使用CONTAINER ID(见下图)代替,如81f7c15f9415

docker容器下命令行连接mysql数据库

首先进入mysql容器的bash终端:

$ sudo docker exec -it mysql bash

连接mysql:

$ mysql -u root -p

输入步骤2.2设置的mysql root密码,之后就可以自由操作mysql了!

image.png

通过宿主机命令行连接mysql

首先在宿主机上安装mysql客户端:

$ sudo apt-get install -y mysql-client

尝试连接:

$ mysql -h 127.0.0.1 -u root -p

输入密码后显然是连接不上的:

先通过步骤2.4连接到mysql,之后添加数据库test,针对此库添加用户testuser,密码是123456先通过步骤2.4连接到mysql,之后添加数据库test,针对此库添加用户testuser,密码是123456

CREATE DATABASE test;
GRANT ALL PRIVILEGES ON test.* TO testuser@172.17.0.1 IDENTIFIED BY '123456';
FLUSH PRIVILEGES;

然后就可以在宿主机上连接mysql数据库了:

$ mysql -h 127.0.0.1 -u testuser -p

docker容器修改mysql密码

1.进入 mysql 容器

docker exec -it mysql /bin/bash

2.修改mysql容器的配置文件

打开配置文件的命令
vi /etc/mysql/my.cnf
在最后一行添加如下代码( //跳过mysql的密码验证)
skip-grant-tables

3.重启mysql容器

docker restart mysql

4.重新进入容器输入命令root为用户名
mysql -u root -p

5.修改密码的命令
update mysql.user set passwrd=“新密码” where ''User" = “username”;

加速镜像

网易蜂巢 hub 镜像

阿里云加速

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
(1)在阿里云申请自己的Docker镜像加速地址

阿里云镜像加速申请 https://cr.console.aliyun.com/cn-qingdao/mirrors

(2)配置Docker镜像加速

  1.编辑daemon.json文件,添加加速配置

vim /etc/docker/daemon.json

{
"registry-mirrors": ["https://registry.docker-cn.com","https://kxv08zer.mirror.aliyuncs.com"]
}
  2.重载所有修改过的配置文件

sudo systemctl daemon-reload
  3.重新启动Docker服务

sudo systemctl restart docker

Docker 给运行中的容器设置端口映射的方法

概念

Docker 端口映射即映射容器内应用的服务端口到本机宿主机器。

实现

当容器中运行一些网络应用,要让外部访问这些应用时,可以通过 -P 或 -p 参数两种方式来指定端口映射。

随机映射

使用 -P 参数时,Docker 会随机映射一个端口到内部容器开放的网络端口,如下开启一个 nginx 服务:

1
2
3
4
5
6
$ docker run -d -P nginx
e93349d539119dc48dc841e117f6388d6afa6a6065b75a5b4aedaf5fb2a051fc
$
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e93349d53911 nginx “nginx -g 'daemon …” 11 seconds ago Up 9 seconds 0.0.0.0:32769->80/tcp zen_kirch

使用 docker ps 看到,本地主机的 32769 端口被映射到了容器的 80 端口,这时我们通过本机浏览器访问 http://localhost:32769 就会出现 nginx 欢迎页面。

指定端口

使用 -p 参数时,可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。支持的格式有:

1
2
3
4
5
6
7
8
9
10
11
IP:HostPort:ContainerPort
IP:ContainerPort
HostPort:ContainerPort
下面开启一个 nginx 服务,将本机 8080 端口映射到容器的 80 端口:

$ docker run -d -p 8080:80 nginx
23e725098712d061a1382f33d6fe54da23ae37597a62f8debdd3731b5f9cc4b9
$
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
23e725098712 nginx “nginx -g 'daemon …” 8 seconds ago Up 6 seconds 0.0.0.0:8080->80/tcp frosty_ptolemy

使用 docker ps 看到,本地主机的 8080 端口被映射到了容器的 80 端口,这时我们通过本机浏览器访问 http://localhost:8080 就会出现 nginx 欢迎页面。

查看映射端口

使用 docker port 命令来查看当前映射的端口配置,也可以查看到绑定的地址。命令格式如下:

$ docker port CONTAINER [PRIVATE_PORT[/PROTO]]
容器有自己的内部网络和 IP 地址,可以使用 docker inspect + 容器ID 获取容器的具体信息。

DOCKER 给运行中的容器添加映射端口

方法1

1、获得容器IP

将container_name 换成实际环境中的容器名
docker inspect container_name | grep IPAddress
2、 iptable转发端口

将容器的8000端口映射到docker主机的8001端口
复制代码 代码如下:

iptables -t nat -A DOCKER -p tcp --dport 8001 -j DNAT --to-destination 172.17.0.19:8000

方法2

1.提交一个运行中的容器为镜像

docker commit containerid foo/live
2.运行镜像并添加端口

docker run -d -p 8000:80 foo/live /bin/bash

docker容器启动后怎么修改端口映射

docker容器启动后怎么修改端口映射?在docker run创建并运行容器的时候,可以通过-p指定端口映射规则。但是,也会遇到刚开始忘记设置端口映射或者设置错了需要修改的情况。当docker start运行容器后,并没有提供一个-p选项或设置,让你修改指定端口映射规则。

通常间接的办法是,保存镜像,再创建一个新的容器,在创建时指定新的端口映射。

方法一:删除原有容器,重新建新容器

这个解决方案最为简单,把原来的容器删掉,重新建一个。当然这次不要忘记加上端口映射。优点是简单快捷,在测试环境使用较多。缺点是如果是数据库镜像,那重新建一个又要重新配置一次,就比较麻烦了。

方法二:利用docker commit新构镜像

docker commit:把一个容器的文件改动和配置信息commit到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。

1、停止docker容器

docker stop container01

2、commit该docker容器

docker commit container01 new_image:tag

3、用前一步新生成的镜像重新起一个容器

docker run --name container02 -p 80:80 new_image:tag

这种方式的优点是不会影响统一宿主机上的其他容器,缺点是管理起来显得比较乱。

方法三:修改文件端口,重启docker服务

1、停止容器(docker stop d00254ce3af7)

2、停止docker服务(systemctl stop docker)

3、修改这个容器的hostconfig.json文件中的端口(如果config.v2.json里面也记录了端口,也要修改)

cd /var/lib/docker/containers/d00254ce3af7* #这里是CONTAINER ID

vim hostconfig.json
如果之前没有端口映射, 应该有这样的一段:
"PortBindings":{}

增加一个映射, 这样写:
"PortBindings":{"8080/tcp":[{"HostIp":"","HostPort":"60000"}]}
前一个数字是容器端口, 后一个是宿主机端口。将宿主机的60000端口映射到容器的8080端口
而修改现有端口映射更简单, 把端口号改掉就行。
4、启动docker服务(systemctl start docker)

5、启动容器(docker start d00254ce3af7)

Docker 进阶

Docker Compose 详解

喜欢这篇文章?打赏一下作者吧!

欢迎关注我的其它发布渠道