Docker

@wanqiuz 2018-05-07 15:15:42发表于 wanqiuz/blog-articles

1 Docker理解

2 Docker环境搭建

2.1 mac下Docker环境搭建

2.1.1 安装

下载、安装、注册:
https://www.docker.com/community-edition#/download
查看版本信息:

docker --version

2.1.2 阿里云docker镜像加速

  1. 登录https://dev.aliyun.com/search.html
  2. 进入右上角管理中心
  3. 在管理中心左边栏找到【Docker Hub 镜像站点】,找到您的专属加速器地址 ,打开Preferences进行设置,如下图:
    fcbc3d39-956f-4038-bc6c-1b8875f8c0db
    qq20180511-213249
  4. 可以在阿里云docker镜像库找镜像: https://dev.aliyun.com/search.html

2.2 linux下Docker环境搭建

2.2.1 安装Docker

首先检查yum更新状态。

yum check-update

安装docker

yum install docker

启动docker服务

systemctl start docker

查看docker状态

systemctl status docker

开机自动启动docker服务

systemctl enable docke

检查docker版本

docker --version

2.2.2 阿里云docker镜像加速

  1. 登录https://dev.aliyun.com/search.html
  2. 进入右上角管理中心
  3. 在管理中心左边栏找到【Docker Hub 镜像站点】,找到您的专属加速器地址 ,如下图:
    qq 20180515164743_

3 开始Docker之旅吧

3.1 仓库(registry)操作

3.1.1 仓库登入

docker login
#### 3.1.2 仓库登出

docker logout

#### 3.1.3 官方registry push太慢解决方法
登入阿里云,修改本地tag(必须修改,否则推不上去),再push:

docker login --username=[阿里云账号] registry.cn-hangzhou.aliyuncs.com
docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/[namespace]/[repository]:[镜像版本号]
docker push registry.cn-hangzhou.aliyuncs.com/[namespace]/[repository]:[镜像版本号]

3.2 镜像(image)和仓库(registry)间操作

3.2.1 搜索远端仓库中的镜像

docker search [imageRepository]

3.2.2 从远端仓库下载镜像到本地

docker image pull [imageRepository][:imageTag]

从远端仓库下载镜像到本地。如果镜像是官方认证的,比如centos,ubantu等,[imageRepository]可以省略仓库组。否则[imageRepository]中需要加仓库组,如[imageLibrary]/[imagename]。[:imageTag]如果不加,则默认为:latest。

3.2.3 将本地镜像传送到仓库

docker image push [username]/[repository]:[tag]

3.3 镜像操作

3.3.1 列出本地所有镜像信息

docker image ls

查看我们本机有哪些镜像,显示他们的仓库名、版本号、iD、创建时间、大小。
形象理解:公司买电脑总有个配置吧,这里假设每一个配置在空间时间上都是惟一的。清单上总要注明什么牌子的,比如联想、戴尔、苹果等等;每一年各品牌都会发布新的电脑,比如2015、2016、2017款macbook各不相同;只要同一个品牌,同一个发行年份、同一种配置才唯一确定一款电脑。
等价命令如下:

docker images

3.3.2 根据Dockerfile构建镜像

Docker image build -t [imageRepository]:[imageTag] .

一共有两种构建镜像的方式,后面会介绍另外一种方式,但这种方式是最好的。此时镜像的构造过程被用代码以文本方式清晰表达出来,方便未来的修改和扩展。

3.3.3 为本地的 image 标注用户名和版本。

docker image tag [imageRepository] [newImageRepository]:[imageTag]

如果构建镜像时没有指定镜像名和版本,匿名镜像用docker image ls查看时一般默认是,用该条指令可以修改。注意:虽然可以有很多,但是每个镜像的ID都是唯一的。

3.3.4 删除镜像

docker image rm [imageID]

等价命令

docker rmi [imageID]

3.4 镜像(image)和容器(container)间操作

3.4.1 根据镜像新建并运行一个容器

docker run -p [hostPort]:[containerPort] -it [imageName]:[imageTag] /bin/bash

每一个镜像都只是一个容器的模板,可以根据某个镜像新建一个容器并运行它,同一个镜像模板可以新建无数个容器。所以该条指令每执行一次,就会创建一个新的容器,同时运行该容器,他们的初始状态相同。
-p会将主机端口[hostPort]映射到容器端口[containerPort]。
-it会在当前终端创建一个交互界面,用来操作容器内部。
[imageName]:[imageTag]是镜像的名字和标签,这两个参数唯一确定一个镜像,[imageTag]默认值为latest。
/bin/bash是容器启动以后,内部执行的第一条命令,这里是启动bash,保证用户可以使用shell。
形象理解:根据配置清单买了一台新电脑,刚买回来,就迫不及待开机了。这个过程每执行一次,就多了一台新电脑。

3.4.2 将容器保存为镜像

docker commit -m "[information]" -a "[userinfo]" [containerID] [imageRepository]:[imageTag]

其中,-m指定说明信息;-a指定用户信息;[containerID]代表容器的id;[imageRepository]:[imageTag]指定目标镜像的用户名、仓库名和 tag 信息。
附:这种镜像生成方式是不推荐的,推荐根据Dockerfile生成镜像。

3.5 容器(container)操作

3.5.1 启动容器:

docker container start [containerID]

容器一共有两个状态,运行中为Up,停止中为Exited。该指令使ID为[containerID]的容器从Exited状态进入到Up状态。
形象理解:电脑开机。

3.5.2 停止容器

docker container stop [containerID]

容器一共有两个状态,运行中为Up,停止中为Exited。该指令使ID为[containerID]的容器从Up状态进入到Exited状态。
形象理解:电脑正常关机。
停止全部运行中的容器:

docker stop $(docker ps -q)

删除全部容器:

docker rm $(docker ps -aq)

如果进入了主机与容器交互的命令行模式时,可以使用命令

exit

退出交互界面,容器依然是Up状态。
如果想让容器一直运行,而不是停止,可以使用快捷键 ctrl+p ctrl+q 退出,此时容器的状态为Up。

3.5.3 重启容器

docker container restart [containerID]

容器一共有两个状态,运行中为Up,停止中为Exited。该指令使ID为[containerID]的容器从Up状态进入到Exited状态,在重新进入到Up状态。
形象理解:重启电脑。

3.5.4 强行停止容器

docker container kill [containerID]

容器一共有两个状态,运行中为Up,停止中为Exited。该指令强行使ID为[containerID]的容器从Up状态进入到Exited状态,而没有执行正常的收尾过程。
形象理解:电脑强行关机。

3.5.5 删除容器

docker container rm [containerID]

将ID为[containerID]的容器删除,执行完毕后该容器彻底从世界上消失了。容器一共有两个状态,运行中为Up,停止中为Exited。该指令执行的前提条件是容器必须在Exited状态,否则会报错。可以用docker container stop [containerID]或者docker container kill [containerID]指令将容器先进入到Exited状态。
形象理解:嫌弃电脑不好,扔到垃圾堆了。
等价命令

docker rm [containerID]

3.5.6 列出容器信息

docker container ls -a

-a则处于Up状态和Exited状态的容器都被列出,否则只有Up状态的容器被列出。
形象理解:看一看整个办公室一共有多少台电脑,每台电脑装的什么系统,什么时候买的,开没开机等等。
等价命令如下:

docker ps -a

3.5.7 展示容器日志

docker container logs [containerID]

查看ID为[containerID]的容器的输出,即容器里面 Shell 的标准输出。如果docker run命令运行容器的时候,没有使用-it参数,就要用这个命令查看输出。
形象理解:如果电脑运行的时候显示器没打开,是不是什么都看不到,虽然我们知道电脑该做的东西一样没少。但是如果我们现在就想看呢,把显示器打开不就好了。

3.5.8 中途进入容器中

docker container exec -it [containerID] /bin/bash

进入到ID为[containerID]的容器中。该指令执行的前提条件是容器必须在Up状态,否则会报错。
形象理解:以前我把电脑键盘、鼠标给没收了,不允许你使用电脑,不管此时电脑放着什么电影,你都得接受,不看也得看。现在我把键盘和鼠标还给你,你可以尽情玩电脑,想看什么电影看什么电影。
等价命令如下:

docker attach [containerID]

3.5.9 容器和主机之间文件传输

docker container cp [containID]:[containerSrcPath] [hostDestPath]
docker container cp [hostSrcPath] [containID]:[containerDestPath]

将ID为[containerID]的容器中路径为[containerSrcPath]的文件或文件夹传到主机[hostDestPath]路径下。将主机[hostSrcPath]路径下的文件或文件夹传到ID为[containerID]的容器[containerDestPath]路径下。
形象理解:就是公司有一个中央服务器,每一台电脑都可以和他传输数据。

补充

比如安装vim:

root@aa97ba3292ce:/# apt-get install vim

docker网络类型:
Bridge: 虚拟出自己的网卡和ip
Host: 用宿主的网络配置,一样
None: 此时将不与外界进行网络通信

启动容器,并端口映射-p,指定映射:

docker run -d -p 8080:80 IMAGE // 8080是主机端口,80是容器端口,IMAGE是容器名字

启动容器,并端口映射-P,自动随机映射:

docker run -d -P IMAGE // IMAGE是容器名字

查看本机网络端口状态

netstat -na|grep 8080

附Docker命令大全:
20171005132826220

4 Docker mysql 镜像

阿里云Docker mysql 镜像说明地址:https://dev.aliyun.com/detail.html?repoId=1239

# Mac下打开终端iTerm
➜ docker pull mysql

# 安装完毕之后,使用如下命令启动了一个叫mysql容器,设置了mysql的root密码为123456,映射宿主主机的端口3306到容器的端口3306
# 由于直接把 mysql 的 3306 端口直接映射到了宿主主机上,在生产环境就会有一定的安全隐患,下面会有其他方法解决
➜ docker run --name mysql -p 3306:3306  -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

# 查询运行的docker容器
➜ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
71b7739428f4        mysql:latest        "docker-entrypoint..."   8 hours ago         Up 1 second         0.0.0.0:3306->3306/tcp   mysql

# 进入容器,创建数据库
➜ docker exec -it 71b7739428f4 bash

# 以下操作是在mysql容器中进行,输入数据库密码 123456 然后创建数据库就行了,退出容器使用exit命令
root@71b7739428f4:/# mysql -u root -p

注意:一定要先运行mysql容器并且创建好数据库,否则构建spring boot应用的时候检测数据库连接不容过,就无法构建成功。

阿里云docker镜像库
https://dev.aliyun.com/search.html

制作自己的镜像:
Dockerfile
docker build

在tomcat中运行应用:

docker pull hub.c.163.com/library/tomcat:latest // 远程拉下运行环境镜像
vi Dockerfile // 某个本地目录下存放Dockerfile 和应用war包等,如jpress.war(应用程序)

from hub.c.163.com/library/tomcat

MAINTAINER wanqiuz xxx@163.com

COPY jpress.war /usr/local/tomcat/webapps

dock build -t jpress:latest // 在旧的镜像上放应用,再根据Dockerfile build生成新的镜像

在mysql

docker pull hub.c.163.com/library/mysql:latest
docker run -d -p 3306:3306 -e MYSQL_ROOT_PASSWORD=000000 -e MYSQL_DATABASE=jpress hub.c.163.com/library/mysql:latest

补充

Docker中安装gcc、gdb时遇到的问题

+ add-apt-repository: command not found

14.04系统解决办法:

apt-get install software-properties-common

older版本的系统:

apt-get install python-software-properties
  • Docker中使用gdb无法进入断点,无法调试

加上--privileged参数

~$ docker run -it --privileged sgy/ubuntu:vim /bin/bash

配置React + Spring boot 环境

docker pull centos:7.4.1708

卸载mariadb

列出所有被安装的rpm package

rpm -qa | grep mariadb
// mariadb-libs-5.5.50-1.el7_2.x86_64
// mariadb-5.5.50-1.el7_2.x86_64
// mariadb-server-5.5.50-1.el7_2.x86_64

强制卸载:

rpm -e --nodeps mariadb-libs-5.5.50-1.el7_2.x86_64
rpm -e --nodeps mariadb-5.5.50-1.el7_2.x86_64
rpm -e --nodeps mariadb-server-5.5.50-1.el7_2.x86_64 

Docker CentOS安装MariaDb

1、安装MariaDB
首先运行

docker run --privileged -itd -p 3307:3306 -v /var/docker/mysql:/var/lib/mysql [imageID] /usr/sbin/init

必须加--privileged,才会有真正的root权限。
/usr/sbin/init保证systemctl可以用。

安装命令
yum -y install mariadb mariadb-server

安装完成MariaDB,首先启动MariaDB
systemctl start mariadb

设置开机启动
systemctl enable mariadb

接下来进行MariaDB的相关简单配置
mysql_secure_installation

首先是设置密码,会提示先输入密码
Enter current password for root (enter for none):<–初次运行直接回车
设置密码
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
其他配置
Remove anonymous users? [Y/n] <– 是否删除匿名用户,回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,回车,
Remove test database and access to it? [Y/n] <– 是否删除test数据库,回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,回车
初始化MariaDB完成,接下来测试登录
mysql -uroot -ppassword
完成。
2、配置MariaDB的字符集

文件/etc/my.cnf

vi /etc/my.cnf
在[mysqld]标签下添加

init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
文件/etc/my.cnf.d/client.cnf

vi /etc/my.cnf.d/client.cnf
在[client]中添加

default-character-set=utf8
文件/etc/my.cnf.d/mysql-clients.cnf

vi /etc/my.cnf.d/mysql-clients.cnf
在[mysql]中添加

default-character-set=utf8
全部配置完成,重启mariadb

systemctl restart mariadb
之后进入MariaDB查看字符集

mysql> show variables like "%character%";show variables like "%collation%";
显示为

+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

+----------------------+-----------------+
| Variable_name | Value |
+----------------------+-----------------+
| collation_connection | utf8_unicode_ci |
| collation_database | utf8_unicode_ci |
| collation_server | utf8_unicode_ci |
+----------------------+-----------------+
3 rows in set (0.00 sec)

字符集配置完成。

3、添加用户,设置权限

创建用户命令

mysql>create user username@localhost identified by 'password';
直接创建用户并授权的命令

mysql>grant all on . to username@localhost indentified by 'password';
授予外网登陆权限

mysql>grant all privileges on . to username@'%' identified by 'password';
授予权限并且可以授权

mysql>grant all privileges on . to username@'hostname' identified by 'password' with grant option;
简单的用户和权限配置基本就这样了。

grant all privileges on *.*  to 'root'@'%' identified by 'password' with grant option;
flush privileges;

注:命令中的password替换成你的mysql密码。

其中只授予部分权限把 其中 all privileges或者all改为select,insert,update,delete,create,drop,index,alter,grant,references,reload,shutdown,process,file其中一部分。

参考并感谢: