linux_docker入门
Posted Dr.psycho
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux_docker入门相关的知识,希望对你有一定的参考价值。
1.Docker的介绍和安装
1.基本介绍
开源项目,dotCloud公司 业余项目
基于google的go语言
后加入linux基金会 遵从apache2.0协议
2)职责的逻辑分类
3)快速高效的开发生命周期
4)鼓励使用面向服务的架构SOA
概念片段:
容器与虚拟机的比较
Docker服务器与客户端
Docker:c/s架构
向服务器/守护进程发出请求,它们会进行返回结果,
命令行
远程,其他,连接
镜像和容器
镜像通过指令创建:
添加一个文件
执行一个命令
打开一个窗口
容器是:
一个镜像格式
一个标准操作
一个执行环境
注册方法
这里集成了各种开发镜像
2.安装方法
通过yum进行安装
- 更新yum包
sudo yum update
一路y
2.更新指令
yum install -y yum-utils device-mapper-persistent-data lvm2
- 设置稳定的存储库
yum-config-manager \\
--add-repo \\
https://download.docker.com/linux/centos/docker-ce.repo
4.可选:启用夜间存储库或测试存储库。
sudo yum-config-manager --enable docker-ce-nightly
sudo yum-config-manager --enble docker-ce-test
5.安装docker引擎
sudo yum install docker-ce docker-ce-cli containerd.io
6.启动docker
sudo systemctl start docker
7.通过运行hello-world映像,验证Docker Engine - Community是否正确安装
sudo docker run hello-world
这个命令下载一个测试映像并在容器中运行它。当容器运行时,它打印一条信息消息并退出。
查看的话会发现多了一个helloworld的镜像
docker images
配置阿里云镜像加速器
登录到你的阿里云当中,搜索镜像加速器
拷贝加速器的链接
然后在你的一下目录当中写入
/etc/docker/daemon.json
{
"registry-mirrors": ["地址"]
}
esc回车
shift+z+z保存
加载配置
systemctl daemon-reload
重启docker
systemctl restart docker
2.mysql的安装和部署
mysql的部署
0.查找mysql的镜像
docker serach mysql
1. 拉取Mysql的镜像
docker pull mysql
输入命令后请耐心等待不要进行其他的操作
2.创建容器
用户名默认是root
密码可以自行修改,这里写的是123456
-p代码端口映射,格式为:宿主机端口,容器运行端口
-e代码添加环境变量 MYSQL_ROOT_PASSWORD是root账号的密码
docker run --name mysql -p 3307:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql
3.进入mysql容器
mysql是我们自定义的名字
docker exec -it mysql bash
4.登录mysql
输入刚才设置的密码
mysql -uroot -p
5.远程登录 mysql
连接宿主机的ip,指定端口为宿主机映射端口3306.
开放权限
(如果因为版本问题或者各种原因不能执行下列的语句则参考附加1来进行操作)
在mysql中进行操作
grant all privileges on *.* to 'root'@'%';
调整远程连接加密模式
调整远程连接的好处是可以兼容数据库版本,因为数据库低版本不能读取高版本的加密方式,所以需要此命令来进行调整加密方法进行数据库的连接.当你进行远程连接的时候就需要输入此密码才能进行远程连接.
alter user 'root'@'%' identified with mysql_native_password by '你想设置的远程连接的密码';
刷新
flush privileges;
关闭防火墙
systemctl stop firewalld
查看防火墙状态是否关闭
systemctl status firewalld
6.进行远程连接测试
因为镜像是高版本镜像,所以需要用到高版本的客户端进行连接测试,如果出现报错,则推荐重启虚拟机来解决问题.还有可能是端口占用的问题,可以通过更改端口映射来解决问题,常见的问题还有,密码加密方法不匹配,因为mysql5.x的密码加密方式和8.x的加密方式不同,所以需要进行调整.
因为我们配置的外部端口号是3308,所以需要通过此端口进行连接,还有就是此密码是配置密码加密方式时所配置的密码,和你的数据库本地密码无关,就是说你配置的远程连接的密码的更改不作用于linux虚拟机命令行登录的密码.
配置如下:
附加1
处理问题的附加内容 没有错误请跳过
- 删除容器
docker rm 容器名称或id
docker rm docker 0627ec6901db
查询名称或id的方法
docker ps -a
docker ps
- 删除镜像
关掉后台的mysql
当我进行删除mysql的镜像的时候发生了一个错误,它提示我有一个进程正在使用mysql,需要我去关掉哪个进程
就是以下的错误:
首先我执行了以下命令用来查询所有的进程
docker ps -a
根据提示信息来进行镜像的删除,先删除占用,再删除mysql镜像
docker rmi 占用程序的id号
docker rmi mysql的id号
重装完数据库之后,再回到0的步骤重新进行数据库的配置
**重要:配置完成后一定要进行重启
要对照映射的端口号:
-p 3308:3306 则远程连接访问的端口号就是3308
对照好密码:
比如在linux中登录的密码是1234
而在远程连接配置的密码是root
在图形化界面中登录的密码就是root
这里面配置的密码就是远程连接的密码,和本地连接无关**
alter user 'root'@'%' identified with mysql_native_password by '你想设置的远程连接的密码';
附加2 数据库密码的修改
1.记得旧密码的修改方法
退出数据库到此界面
输入以下指令
mysqladmin -uroot -p旧密码 password 新密码;
mysqladmin -uroot -p1234 password root;
2.忘记密码的重置方式
- 在伪命令行中安装vim 执行以下命令
apt-get update
apt-get install vim
2. 修改权限
退出数据库并执行以下命令
vi etc/mysql/my.cnf
加入此行(skip-grant-tables):跳过权限认证,没有此文件的,需要加上所有
[mysqld]
skip-host-cache
skip-name-resolve
skip-grant-tables
3.回到根目录,重启mysql容器
这个mysql是你自定义的名字,也可以是id号
查询正在运行的容器
docker ps
docker restart mysql
4.进入mysql容器,不用输入密码直接就可以进入(直接回车就行)
5.进入数据库并把mysql库中的user表的root用户的密码设置为空
use mysql
update user set authenticatication_string='' where user='root';
6.放开验证权限
(1)退出数据库再进入my.cnf进行权限的放开
exit
vim etc/mysql/my.cnf
(2)退出伪命令行进入到linux虚拟机的命令行当中并执行重启容器的指令
7.重新设置密码
(1)进入数据库,不用输入密码直接进入
(2)设置新密码
说明:alter user '用户名'@'本地连接' identified by '新密码';
示例:alter user 'root'@'localhost' identified by 'root';
刷新权限
flush privileges;
(3)退出并重新登录
但这时我们遇见一个问题,就是无法进行远程连接,那么就执行下面的语句
alter user 'root'@'%' identified with mysql_native_password by '你想设置的远程连接的密码';
再进行远程连接就会指向成功了
附加3 数据库忘记密码的优化版本
- 以一个新的容器为例,从而可以让大家看到一个完整的流程(看教程的可以直接跳过到第三步)
可以看到这里有一个容器我们现在删除它
查看运行中的容器
docker ps
停止容器
docker stop 容器id/容器名
容器id的演示(根据docker ps查询到的id号)
docker stop f4afe3c3409e
容器名的演示(根据ps指令对应NAMES字段的值)
docker stop mysql
删除容器
docker rm 容器名
docker rm f4afe3c3409e
docker rm mysql
2.重新运行一个容器
docker run -di --name=mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD='root' -d mysql
-di守护进程
--name新建的容器别名
-p端口映射
-e设置环境变量,这里是设置的初始化数据库的密码
-d镜像源
3.进入此容器中,装载vim编辑
进入容器的命令:
docker exec -it mysql bash
装载vim的方法
apt-get update
apt-get install vim
执行进入进入容器的命令之后发现路径发生了变化 root@localhost ~ —> root@31d2651a7839:/
先执行更新方法 apt-get update
再执行装载方法apt-get install vim
他会问你是否确定 ,输入y即可
4.进入指定目录修改权限限制
这时候vim指令已经可以用了
输入以下命令以进入指定的目录
vim etc/mysql/my.cnf
在[mysqld] 下方输入以下语句(这样做是为了跳过权限限制)
严重错误:请注意,一定不要输错,如果输错并刷新之后,容器将不能启动
skip-grant-tables
这时候还不能登录进入数据库,需要进行刷新才能成功免密登录
再次进入数据库发现已经可以成功免密访问了
修改my.cnf文件
请注意输入语句的路径位置,需要我们退出容器目录在根目录上执行此语句
完整的截图:
5.进入mysql库中,修改user表中的密码(优化)
(1)指定mysql数据库
use mysql
(2)修改root用户密码为空
update user set authentication_string='' where user='root';
(3)刷新权限
flush privileges;
(4)添加localhost(本命令行登录)密码
alter user 'root'@'localhost' identified by 'aaaa';
(5)添加远程连接密码(这里我们为了便于记忆设成和localhost一样的密码
alter user 'root'@'%' identified with MYSQL_NATIVE_PASSWORD by 'aaaa';
(6)再次刷新权限
flush privileges;
6.授权数据库并重启
(1)删除skip-grant-tables语句
先退出数据库至数据库的根目录,然后再次进入my.cnf文件当中,删除skip-grant-tables语句保存退出.
vim etc/mysql/my.cnf
(2)退回到根目录进行容器的重启
docker restart 容器id/容器名
docker restart mysql
docker restart 31d2651a7839
(3)测试连接
连接容器数据库:
数据库远程连接
3.Tomcat的安装和部署
1.查询镜像并安装
docker search tomcat
(1)查看官网镜像
(2)安装镜像
docker pull tomcat
(3)通过-v进行映射关系的书写
(4)检查tomcat是否加入镜像列表
2.运行容器:
1.利用交互式方法运行tomcat
输入指令(不加-d的话退出的话就会直接退出容器,因为没有加入到后台进程)
docker run -it --name=容器名称 镜像名称:标签 /bin/bash
docker run -it --name=tomcat tomcat /bin/bash
然后进入到webapps中把目录复制保存,一会需要配置映射关系
大概就是下面这个目录
usr/local/tomcat/webapps
2.把tomcat挂载到后台
需要创建一个webapps目录
回到root
进入home目录
创建webapps目录
exit
cd /home
mkdir webapps
进入到webapps中并记录下路径
/home/webapps
写入一下命令进行挂载
docker run -id --name=tomcat -v /home/webapps:/usr/local/tomcat/webapps -p 8081:8080 tomcat
如果以前配置过出现端口占用的情况,
请删除以前的镜像
查看镜像
docker images
删除镜像
docker rmi IMAGE ID
docker rmi 47c156f4d4e3
3. 查看运行状态:
开放端口:
firewall-cmd --zone=public --add-port=8081/tcp --permanent
重新加载一下:
firewall-cmd --reload
firewall-cmd --list-ports
出现8081/tcp则说明开放成功
4.创建一个页面用于访问
cd /home/webapps/
mkdir ROOT
cd ROOT/
touch index.html
接着编辑这个index页面
vim index.html
随便写一个页面用于测试:
在地址栏输入ip地址和端口号进行访问
5.中文页面乱码的解决方案
如果测试出现乱码请修改字符集
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<title>从docker容器中启动tomcat</title>
</head>
<body>
看到这个页面说明docker的tomcat容器启动成功了
</body>
</html>
登录守护式容器的方式:
如果你在root下要怎么进入到tomcat中呢?
docker exec -it 容器名称(或者容器id) /bin/bash
docker exec -it tomcat /bin/bash
如果不知道名称的话可以进行查询
在root下进行查询
docker ps -a
docker ps
curl指令可以在linux中访问页面(文字页面)
curl localhost:8081
6.拷贝目录/文件的实施方法
测试tomcat多个端口运行
再启动一个tomcat
docker run -id --name=tomcat2 -v /home/webapps2:/usr/local/tomcat/webapps -p 8082:8080 tomcat
复制文件到指定的目录当中
docker cp 宿主机文件或目录 容器名称:容器目录
docker cp 容器名称:容器目录 需要copy到宿主机的文件或目录
docker cp index.html 36fd800b7b76:/usr/local/tomcat/webapps
查看是否copy成功
把容器中的文件copy到宿主机中
首先退出容器,然后执行下列的命令
docker cp /usr/local/tomcat/webapps /usr/
7.查看容器ip地址
docker inspect 容器名称或id
docker inspect --format='{{.NetworkSettings.IPAddress}}' 容器名称(或者容器ID)
例子:
docker inspect 36fd800b7b76
docker inspect --format='{{.NetworkSettings.IPAddress}}' 36fd800b7b76
删除容器
docker rm 容器名称(或容器id)
删除容器的时候他说我不能删除正在运行的容器,那我停止了不就完了吗.
停止容器
docker stop 50eb8e2af48a
再次执行删除命令
docker rm 50eb8e2af48a
查看是否删除成功
docker ps
发现已经没有该容器
4.基本练习的补充
Docker命令
1.帮助命令
docker --help
docker run --help
docker start/restart/stop mysql
docker ps -a
当遇到困惑的时候都可以通过帮助命令来寻找最适配的命令方法
docker 需要进行查询的指令 --help
eg:
docker run --help
这个查询的就是docker run的使用方法可以跟什么参数,有什么含义等
2.查看命令
查看端口的命令
firewall-cmd --list-port
查看防火墙命令
systemctl status firewalld
3.运行容器命令
运行tomcat容器
docker run -di --name=tomcat -v /home/webapps:/usr/local/tomcat/webapps -p 8081:8080 tomcat
实例:
同时开启多个tomcat
运行tomcat容器
docker run -di --name=tomcat -v /home/webapps:/usr/local/tomcat/webapps -p 8081:8080 tomcat
当我们关闭防火墙的时候,我们不能再创建容器.(这实际上就是为了保证我们的安全性操作)
当我们重启的时候这些容器还在吗?
答案是否定的,但我们可以通过一下指令来查看启动过的容器:
docker ps -a
比如我想运行其中的某几个容器,根据id号
docker start cc301d8a464d e85df9988364 e91de51cc4ec af0608aa3025 36fd800b7b76
这几个容器就成功运行了
3.查看容器的ip地址
docker inspect 容器的id
docker inspect 36fd800b7b76
通过执行下列命令可直接输出IP地址
docker inspect --format='{{.NetworkSettings.IPAddress}}' 36fd800b7b76
4.管道命令
在查询信息的后面加上|grep xx
意思是打印全部信息把xx有关的信息显示在末尾
示例:
docker inspect 36fd800b7b76|grep IP
5.重定向json数据到指定的目录
docker inspect 36fd800b7b76 > /home/tomcat.json
其中 36fd800b7b76是容器id
/home是目录
/tomcat.json 是新创建的文件
打开ftp工具,可以发现tomcat.json已经被重定向到指定的目录 (/home目录下)
mysql容器启动的错误演示
启动mysql容器
这只是一个演示:当我们已经有了mysql的容器之后就不能通过这种方法进行创建了
请以此命令为准
docker run -di --name=mysql2 -p 3306:3306 -e Mysql_ROOT_PASSWORD=root -d mysql
补充:-e的含义是设置环境变量
-e 后面跟的Mysql_ROOT_PASSWORD是此版本镜像的内置的参数,如果遇到的镜像没有此字段,则设置也不生效.
因为我之前已经创建了一个mysql的容器,所以这次启动导致了错误
然后删除其中一个,再通过以下指令开启容器
docker start 容器名/id
docker start mysql
发现容器已经开启
通过远程连接测试数据库是否能够正常运行:
进入mysql容器根目录的两种方法
docker exec -it mysql /bin/bash
docker exec -it mysql bash
比较linux和mysql目录的异同:
因为是基于linux的mysql做到和linux目录结构相同,这样就便于和linux虚拟机交互信息(因为此mysql版本是根据docker下载而来的,根据基础的linux镜像从而制作的mysql镜像,这样能够实现快速,高效和便捷)
查找目录结构:(相当于windows的搜索引擎)
命令:
find / -name mysql
find / -name 查找的包含此字段的路径
把容器保存成镜像
docker commit 容器id 自定义名称:标签(自定义信息)
docker commit 36fd800b7b76 mytomcat:5.11
查看进行发现多了一个刚创建的镜像
docker images
对照这个表就能够体会到创建的名称:标签的含义,分别对照REPOSITORY 镜像名
TAG 标签,从中我们发现,我们拷贝的是容器id但是生成的是镜像id,这是系统给我们生成的一个id号
输入指令进行保存镜像(一定要严格按照我们创建的信息去书写)
docker save -o mytomcat.tar mytomcat:5.11
输入命令查看大小
ll -h
镜像的恢复与迁移
刚才我们已经把镜像保存到了tar包里面,现在我们检验这个tar包是否能够成功加载成镜像,所以我们需要先去删除这个镜像
docker rmi mytomcat:5.11
然后通过加载tar包实现恢复镜像,同理如果把tar包转移到另外的宿主机上同样也能够恢复镜像
主要:
docker load -i mytomcat.tar
这样这个tar包就加载成功了
5.Dockerfile
Dockerfile命令
概念,看看就行了
命令 | 作用 |
---|---|
FROM image_name:tag | 定义了使用哪个基础镜像启动构建流程 |
MAINTAINER user_name | 声明镜像的创建者或维护者信息 MAINTAINER user_name 可以把环境变量设置到容器内部 |
ENV key value | 设置环境变量(可以写多条) 格式为:ENV key value 例如:ENVJAVA_HOME/path/to/java |
RUN command | 是Dockerfile的核心部分(可以写多条) 格式:RUN 在shell终端运行,使用这种格式,就像直接在命令行中输入命令一样 |
ADD source_dir/file dest_dir/file | 将宿主机的文件复制到容器内,如果是压缩文件,将会在复制后自动解压 |
COPY source_dir/file dest_dir/file | 和ADD相似,但是如果是压缩文件并不能解压 |
WORKDIR path_dir | 设置工作目录,也可说是切换目录指令,类似cd命令,卸载该指令后的RUN,CMD以及ENTRYPOINT指令都将该目录作为当前目录,并执行相应命令 |
ARG 设置构建参数 | ARG指令用于设置构建参数,类似EVN和EVN不同的是,ARG设置的是构建的环境变量,在容器运行时是不会存在这些变量的 |
CMD容器启动命令 | 用于为执行容器提供默认值,每个DOCKerfile只有一个CMD命令,如果指定多个CMD命令,name只有最后一条会被执行,如果启动容器时制定了运行的命令,则会覆盖CMD指定的命令.支持3种格式: CMD[“executable”,“param1”,“param2”] CMD[“param1”,“param2”] (为ENTYRPOINT指令提供预设参数) 实例:CMD echo “this is a test.”|wc - |
ENTRYPOINT入口点 | ENTRYPOIN和CMD命令的目的一样,都是指向docker容器启动时执行的命令,可以多次设置,但是只有最后一个有效 |
EXPOSE声明暴露的端口 | EXPOSE指令用于声明在运行时容器提供服务的端口,格式为:EXPOSE […] 可以声明暴露多个端口 需要注意的是,这只是一个声明,运行时并不会因为该声明就打开相应的端口.该指令的作用主要是帮助镜像使用者理解该项服务的守护端口;其次是当运行时使用随机映射时,会自动映射EXPOSE的端口 |
docker file的简单运用
实例的演示
(springboot的部署和发布通过Dockerfile脚本进行自动装配)
1.创建一个springcloud项目
可以根据自己的需要来添加模块
创建一个java类
path:controller.HelloController
package com.xcong.java.first.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping("hello")
public String hello(){
return "hello";
}
}
运行成功的控制台截图.并且可以成功的访问网页
2.在maven插件中点击install进行项目的打包
展开左侧菜单的target可以看到jar包已经生成成功了!
因为此jar包的名字比较long,所以我们决定重新让它打包,更改为比较简短的名字
<finalName>first</finalName>
再次在maven插件中双击install,
找到此jar包复制到桌面新建文件夹中
3.在Dos命令行中进行项目的发布
在地址栏中输入cmd,开启当前路径的cmd命令行
由于端口冲突需要先把idea中的项目停掉
在命令行中输入java -jar jar包全名 来运行它
然后在浏览器中访问它
当命令行关掉的时候,我们还能成功访问吗?
答案是不能!
4.补充
(此浏览器显示的信息是return的信息,return “” 和映射无关)
linux中利用Dockerfile脚本进行项目的发布
1.添加保存位置
在linux虚拟机中执行以下命令,创建一个文件夹,在文件夹中创建一个文件,并进行修改,另外把刚生成的first.jar包也导入到此文件夹中
mkdir firstDocker
cd firstDocker
touch Dockerfile
vim Dockerfile
这个文件夹中有两个文件
2.开启新连接
多开一个连接,和当前连接相同的连接,我们要在新连接中查找镜像
现在我有两个连接,一个是打开的编译文件的连接,一个是命令行界面,这两个连接是同一个虚拟机的连接
3.写入脚本
然后在刚才打开的Dockerfile文件中写入信息
此端口号如果没有在springboot的配置文件进行配置,就按照8080端口
如果你进行配置就更改为你配置的端口号
from java:8
workdir /home
add first.jar /home
expose 8080
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/home/first.jar"]
wq保存退出
4.构建镜像
然后执行命令用于保存镜像:
这个创建任务是默认根据我们写好的脚本进行拉取和配置的,我们只需要拉取
docker build -t="first:1.0" .
请耐心等待构建完成.
删除此镜像,再次构建就发现比原先的速度要快的多
5.创建容器
没删除用1.0
docker run -di --name=first -p 8080:8080 first:1.0
删除用2.0
docker run -di --name=first -p 8080:8080 first:2.0
此端口号如果没有在springboot的配置文件进行配置,就按照8080端口
如果你进行配置就更改为你配置的端口号
查看容器发现容器没有运行
docker ps -a
那我们就手动运行它
docker start 767997dd59df
查看log日志,发现已经运行成功
docker logs 767997dd59df
6.测试访问
在浏览器中
以上是关于linux_docker入门的主要内容,如果未能解决你的问题,请参考以下文章
Cg入门20:Fragment shader - 片段级模型动态变色(实现汽车动态换漆)
Cg入门19:Fragment shader - 片段级模型动态变色