三、Docker快速入门
1.Docker简介
Docker是一个开源的容器引擎,它可以帮助我们更快地交付应用。Docker可将应用程序和基础设施层隔离,并且能将基础设施当作程序一样进行管理。使用Docker,可更快地打包、测试以及部署应用程序,并可减少从编写到部署运行代码的周期。
Docker官方网站:https://www.docker.com/
1.1 Docker版本
1.1.1 Docker(企业版)
Docker EE由公司支持,可在经过认证的操作系统和云提供商中使用,并可运行来自Docker Store的、经过认证的容器和插件。
1.1.2 Docker(免费版)
Docker CE是免费的Docker产品的新名称,Docker CE包含了完整的Docker平台,非常适合开发人员和运维团队构建容器APP
1.2 Docker架构
1.2.1 Docker daemon(Docker守护进程)
Docker daemon是一个运行在宿主机(DOCKER_HOST)的后台进程。我们可通过Docker客户端与之通信。
1.2.2 Client(Docker客户端)
Docker客户端是Docker的用户界面,它可以接受用户命令和配置标识,并与Docker daemon通信。图中,docker build等都是Docker的相关命令。
1.2.3 Images(Docker镜像)
Docker镜像是一个只读模板,它包含创建Docker容器的说明。它和系统安装光盘有点像——我们使用系统安装光盘安装系统,同理,我们使用Docker镜像运行Docker镜像中的程序。
1.2.4 Container(容器)
容器是镜像的可运行实例。镜像和容器的关系有点类似于面向对象中,类和对象的关系。我们可通过Docker API或者CLI命令来启停、移动、删除容器。
1.2.5 Registry(仓库)
Docker Registry是一个集中存储与分发镜像的服务。我们构建完Docker镜像后,就可在当前宿主机上运行。但如果想要在其他机器上运行这个镜像,我们就需要手动拷贝。此时,我们可借助Docker Registry来避免镜像的手动拷贝。
一个Docker Registry可包含多个Docker仓库;每个仓库可包含多个镜像标签;每个标签对应一个Docker镜像。这跟Maven的仓库有点类似,如果把Docker Registry比作Maven仓库的话,那么Docker仓库就可理解为某jar包的路径,而镜像标签则可理解为jar包的版本号。
2.Docker安装启动
2.1 运行安装环境
采用Linux操作系统,版本为:Centos7.0 64位,Docker采用CE版:18.06.0.ce-3
2.2 Docker安装过程
2.2.1 下载Docker-CE rpm安装包
https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
注意下载版本要和操作系统版本对应。
docker-ce-18.06.0.ce-3.el7.x86_64.rpm
2.2.2 安装Docker
上传 docker-ce-18.06.0.ce-3.el7.x86_64.rpm 到opt
执行命令: yum install -y docker-ce-18.06.0.ce-3.el7.x86_64.rpm
注意:确保linux服务器处于联网状态。
常见问题:
当用yum安装时报错。。。
Error: Package: glibc-headers-2.17-196.el7_4.2.x86_64 (ultra-centos-7.4-updates)
Requires: glibc = 2.17-196.el7_4.2
Installed: glibc-2.17-222.el7.x86_64 (installed)
glibc = 2.17-222.el7
Available: glibc-2.17-196.el7.x86_64 (ultra-centos-7.4-base)
glibc = 2.17-196.el7
Available: glibc-2.17-196.el7_4.2.x86_64 (ultra-centos-7.4-updates)
glibc = 2.17-196.el7_4.2
Error: Package: gcc-4.8.5-16.el7_4.2.x86_64 (ultra-centos-7.4-updates)
Requires: libgomp = 4.8.5-16.el7_4.2
Installed: libgomp-4.8.5-28.el7_5.1.x86_64 (installed)
libgomp = 4.8.2-16.el7_5
libgomp = 4.8.5-28.el7_5.1
Available: libgomp-4.8.5-16.el7.x86_64 (ultra-centos-7.4-base)
libgomp = 4.8.5-16.el7
libgomp = 4.8.2-16.el7
Available: libgomp-4.8.5-16.el7_4.1.x86_64 (ultra-centos-7.4-updates)
libgomp = 4.8.5-16.el7_4.1
libgomp = 4.8.2-16.el7_4
Available: libgomp-4.8.5-16.el7_4.2.x86_64 (ultra-centos-7.4-updates)
libgomp = 4.8.5-16.el7_4.2
libgomp = 4.8.2-16.el7_4
Error: Package: glibc-devel-2.17-196.el7_4.2.x86_64 (ultra-centos-7.4-updates)
Requires: glibc = 2.17-196.el7_4.2
Installed: glibc-2.17-222.el7.x86_64 (installed)
glibc = 2.17-222.el7
Available: glibc-2.17-196.el7.x86_64 (ultra-centos-7.4-base)
glibc = 2.17-196.el7
Available: glibc-2.17-196.el7_4.2.x86_64 (ultra-centos-7.4-updates)
glibc = 2.17-196.el7_4.2
You could try using --skip-broken to work around the problem
You could try running: rpm -Va --nofiles --nodigest
解决办法:
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
sed -i 's/$releasever/7/g' /etc/yum.repos.d/CentOS-Base.repo
、yum repolist
2.2.3 启动与停止Docker
启动docker:systemctl start docker
停止docker:systemctl stop docker
重启docker:systemctl restart docker
查看docker状态:systemctl status docker
2.2.4 验证Docker是否安装成功
执行命令:docker info
查看返回信息,能否查看到Docker相关信息
到此,Docker安装完毕!
3.Docker配置镜像加速器
国内访问Docker Hub的速度很不稳定,有时甚至出现连接不上的情况。我们来为Docker配置镜像加速器,从而解决这个问题。目前国内很多云服务商都提供了镜像加速的服务。
常用的镜像加速器有:阿里云加速器DaoCloud加速器等。各厂商镜像加速器的使用方式大致类似,笔者以阿里云加速器为例进行讲解。
注册阿里云账号后,即可在阿里云控制台(https://cr.console.aliyun.com/#/accelerator)看到类似如下的页面。
3.1 新建编辑: /etc/docker/daemon.json
{
“registry-mirrors”: [“https://ksc53x4t.mirror.aliyuncs.com”]
}
3.2 修改保存后输入如下命令重启Docker守护进程和服务
重启docker守护程序
systemctl daemon-reload
重启docker服务
systemctl restart docker
查看docker容器信息
docker info
查看最后倒数第二行出现如下内容说明配置成功
Registry Mirrors:
https://j4pan1gm.mirror.aliyuncs.com/
4.docker镜像操作的常用指令
4.1 搜索指令
4.1.1通过镜像仓库搜索
Docker镜像仓库网址:https://hub.docker.com/search?q=&type=image
4.1.2 指令搜索
docker search tomcat //搜索tomcat镜像
4.2 下载镜像
docker pull 镜像名称 //查询最近的版本
docker pull 镜像名称:版本标签
如:
docker pull tomcat
docker pull tomcat:8.5.57-jdk8-openjdk-slim
4.3 查看本地镜像
docker images
4.4 删除镜像
docker rmi tomcat:8.5.57-jdk8-openjdk-slim //通过镜像名:版本号
或
docker rmi b1a27cee0cec //通过IMAGE ID删除
4.5 保存镜像为文件
docker save -o /root/tomcat.tar tomcat:8.5.57-jdk8-openjdk-slim
// -o /root/tocmat.tar 保存为文件的地址
4.6 把保存的镜像备份文件恢复成镜像
docker load -i /root/tomcat.tar
5.Docker容器操作常用指令
5.1 使用镜像新建一个容器
docker run
-
创建并运行一个java容器,打印helloworld!
docker run java:8 /bin/echo ‘Hello World!’
-
创建一个Centos容器
docker run -ti –name=c1 centos:centos7 /bin/bash
-d 表示守护式容器(用户退出容器后,容器依然可以正常运行)
-i 运行容器
-t 交互 后面跟交互shell脚本 /bin/bash
centos:centos7 镜像名称
-
创建一个有网络使用容器
如:创建一个容器nginx 端口为 80
-p 端口映射 宿主机端口:容器端口
5.2 列出容器
- 列出当前正在运行的容器 docker ps
- 列出当前全部容器 docker ps -a
- 列出当前容器的所有编号 docker ps -a -q
5.3 停止容器
docker stop 容器的names
docker stop 容器的CONTAINER ID
如:
docker stop c1
docker stop 36bee7ca1cf4
5.4 启动容器
docker start 容器名称或容器编号
docker start n1
5.5 强制停止容器
docker kill 容器名称或容器编号
5.6 重启容器
docker restart 容器名称或者容器编号
5.7 如何进入到容器
docker exec -it c1 /bin/bash
5.8 退出容器
exit
5.9 从宿主机拷贝文件到容器
在宿主机上创建文件并编辑
touch java511.txt
vi java511.txt
拷贝到容器中
docker cp /java511.txt c1:/root/
5.10 从容器拷贝文件到宿主机
docker cp c1:/1.java /root/2.java
5.11 挂载宿主机的制定目录到容器(其中 –privileged 是可选的)
(如果你共享的是多级的目录,可能会出现权限不足的提示。这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数 –privileged=true 来解决挂载的目录没有权限的问题)
docker run -di –name=c2 -v /root/html:/test0722 –privileged centos:centos7
5.12 删除容器
docker rm 容器名称或者编号 //注意 不能删除正在运行中容器, 需要停掉才可以删除 -f 强制删除
5.13 查看容器ip
docker inspect n1 //输出的内容较多
docker inspect –format=’{{.NetworkSettings.IPAddress}}’ n1 //只输出ip
5.14 查看容器日志输出
docker logs n1 查看日志
docker logs –tail=“2” n1 查看日志 左后2行。
5.15、设置容器开机自启动
docker update –restart=always 容器名称 //设置开机自启动
docker update –restart=no 容器名称 //禁止开机自启动
6.Java开发者Docker常用镜像容器创建
6.1 JDK部署
6.1.1 拉取JDK镜像
执行命令: docker pull java:8
6.1.2 创建JDK容器
执行命令:docker run -di --name jdk1 java:8
说明:jdk安装的是openjdk,具体安装路径是:/usr/lib/jvm/java-1.8.0-openjdk-amd64
6.1.3 进入容器验证Java环境
docker exec -it jdk1 /bin/bash
java -version
6.2 MySQL部署
6.2.1拉取MySQL镜像
执行命令:docker pull mysql:5.7
6.2.2 创建MySQL容器
第一种创建容器MySQL容器的方式
docker run -d --name=offcn_mysql -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=scwdb mysql:5.7
-p 代表端口映射,格式为 宿主机映射端口:容器运行端口
-e MYSQL_ROOT_PASSWORD=123456 //表示设置root的密码为123456
-e MYSQL_DATABASE=scwdb //创建mysql数据库容器的同时初始化创建一个数据库 scwdb
//开启mysql容器
docker exec -it offcn_mysql /bin/bash
//登录mysql
mysql -u root -p
//赋外网访问权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
//刷新权限
flush privileges;
如上创建需要解决中文乱码问题乱码(默认是latin1)
show variables like ‘character_set_%’;
乱码解决方案:
a. 进入offcn_mysql容器 修改配置文件/etc/mysql/mysql.conf.d/mysqld.cnf
注意 因为offcn_mysql容器中不能使用vi命令,所以我们将文件拷贝到宿主机后修改后在拷贝回去
b. docker cp offcn_mysql:/etc/mysql/mysql.conf.d/mysqld.cnf /root/
vi mysqld.cnf
找到[mysqld] 在其下添加编码处理
character-set-server=utf8
collation-server=utf8_general_ci
保存
c. docker cp /root/mysqld.cnf offcn_mysql:/etc/mysql/mysql.conf.d/mysqld.cnf
d. 重启容器 docker restart offcn_mysql
第二种创建容器MySQL容器的方式
创新容器同时创建表的时候,解决中文问题(使用挂载的方式,将刚刚解决乱码的mysqld.cnf 挂载下容器中相应的位置)
docker run -d --name=offcn_mysql -p 33306:3306 -v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -e MYSQL_ROOT_PASSWORD=123456 -eMYSQL_DATABASE=dongyimaidb mysql:5.7
第三种创建容器MySQL容器的方式
在创建mysql容器时候,执行初始化数据库脚本 (将scwdb 数据库导出, 其中不要勾选 添加创建数据库语句 ,然后上传到 宿主机root目录)
docker run -d --name=offcn_mysql -p 33306:3306 -v /root/mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf -v /root/scwdb.sql:/docker-entrypoint-initdb.d/mysql.sql -e MYSQL_ROOT_PASSWORD=123456 -eMYSQL_DATABASE=dongyimaidb mysql:5.7
//开启mysql容器
docker exec -it offcn_mysql /bin/bash
//登录mysql
mysql -u root -p
//赋外网访问权限
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
//刷新权限
flush privileges;
6.2.3 连接MySQL容器数据库
远程连接mysql数据库只需要使用宿主机ip和端口33306就可以
6.3 Redis 部署
6.3.1 拉取Redis镜像
执行命令:docker pull redis:4.0.8
6.3.2 创建Redis容器
执行命令: docker run -di --name redis -p 16379:6379 redis:4.0.8
7.Dockerfile入门(了解)
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像(centos或者ubuntu,即操作系统级别的镜像)并最终创建一个新的镜像。
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
- 对于运维人员:在部署时,可以实现应用的无缝移植。
7.1 Dockerfile常用命令
7.2 自主创建jdk镜像
(1) 创建一个目录: mkdir /usr/local/dockerjdk
(2) 上传 jdk-8u131-linux-x64.tar.gz到 /usr/local/dockerjdk/
(3) 创建一个 Dockerfile 文件 并编辑 vi Dockerfile 内容如下
FROM centos:centos7
MAINTAINER ujiuye
RUN mkdir /usr/local/java
ADD jdk-8u131-linux-x64.tar.gz /usr/local/java/
ENV JAVA_HOME /usr/local/java/jdk1.8.0_131
ENV CLASSPATH $JAVA_HOME/lib
ENV PATH $JAVA_HOME/bin:$PATH
保存文件
(4) 创建镜像 为jdk1.8
docker build -t=‘jdk1.8’ /usr/local/dockerjdk/
(5) 查看已经创建的镜像
docker images
(6) 使用自定义的镜像创建一个容器
docker run -di –name=java1 jdk1.8
(7) 查看创建的容器
docker ps
(8) 验证自定义容器jdk环境是否正常
docker exec -it java1 /bin/bash
java -version
7.3 自主创建tomcat镜像
(1) 创建目录 mkdir /usr/local/dockertomcat
(2) 上传jdk tomcat 到文件中
(3) 创建Dockerfile vi Dockerfile 内容如下
FROM centos:centos7
MAINTAINER ujiuye
RUN mkdir /usr/local/app
ADD jdk-8u131-linux-x64.tar.gz /usr/local/app/
ADD apache-tomcat-8.5.15.tar.gz /usr/local/app/
ENV JAVA_HOME /usr/local/app/jdk1.8.0_131
ENV CATALINA_HOME /usr/local/app/apache-tomcat-8.5.15
ENV CLASSPATH $JAVA_HOME/lib
ENV PATH $JAVA_HOME/bin:$CATALINA_HOME/bin:$PATH
EXPOSE 8080
CMD ["/usr/local/app/apache-tomcat-8.5.15/bin/catalina.sh","run"]
(4)创建镜像 docker build -t=‘tomcat8.5:10’ .
(5)查看镜像 docker images
(6)创建容器 docker run -di –name=tomcat999 -p 5555:8080 tomcat8.5:10
(7)查看容器 docker ps
(8)访问: http://192.168.188.133:5555/