Docker
Docker
1、简介
Docker 是一个开源的应用容器引擎;
Docker支持将软件编译成一个镜像,然后在镜像中的各种软件做好配置,将镜像发布出去,其他使用者可以直接使用这个镜像。
运行中的在这个镜像称为容器,容器启动是非常快速的。
2、核心概念
docker主机(Host):安装了Docker程序的机器(Docker直接安装在操作系统之上)
docker客户端(Client):连接docker主机镜像操作
docker仓库(Registry):用来保存各种打包好的软件镜像
docker镜像(Images):软件打包好的镜像,放在docker仓库中
docker容器(Container):镜像启动后的实例称为一个容器,容器是独立运行的一个或一组应用
使用Docker的步骤:
1、安装Docker
2、去Docker仓库去找到要安装的软件对应的镜像
3、使用Docker运行这个镜像,这个镜像就会生成一个Docker容器
4、对容器的启动停止就是对这个软件的启动停止
安装Docker
1、检查内核版本,3.10及以上
uname -r
2、安装Docker
apt-get -y install docker
3、启动Docker
systemctl start docker
4、检查版本
docker -v
5、设置开机启动
systemctl enable docker
6、停止Docker
systemctl stop docker
Docker基本操作
1、搜索镜像,比如搜索mysql(会从 Docker Hub 中搜索 http://hub.docker.com)
docker search mysql
2、下载镜像
#默认下载latest版本
docker pull mysql
#指定版本下载
docker pull mysql:5.5
3、查看docker中有多少镜像
docker images
4、删除指定镜像
docker rmi 加上imageId
Docker容器操作
软件镜像(QQ的安装程序)----> 运行镜像(运行安装程序)----> 产生一个容器(运行的QQ)
步骤:
1、搜索镜像
docker search tomcat
2、拉取镜像
docker pull tomcat
3、根据镜像启动容器
docker run --name mytomcat -d tomcat:latest
注意:mysql 不可以此方式启动,会异常退出 正确启动方式见下方
4、查看运行中的容器
docker ps
5、停止运行中的容器
docker stop 名字 或 CONTAINERID(容器的id)
#例如
docker stop dec70e978492
#或
docker stop mytomcat
6、查看所有的容器(运行的和退出的)
docker ps -a
7、重新启动容器
docker start dec70e978492 (容器id)
#或
docker start mytomcat (名字)
8、删除容器(删除的容器必须是停止状态)
docker rm dec70e978492(容器id)
#或
docker rm mytamcat(名字)
9、启动容器并配置端口映射
docker run -d -p 8888:8080 tomcat
-d:后台运行
-p:将主机端口映射到容器的一个端口 (主机端口:容器内部的端口)
启动之后,浏览器访问 ip:8888 即可访问容器中的 8080 端口
查看防火墙状态:
service firewalld status
关闭防火墙:
service firewalld stop
11、查看容器的日志
docker logs ce5a33d06152(容器id)
#或
docker logs mytomcat(名字)
12、一个镜像可以启动多个容器:
docker run -d -p 8887:8080 tomcat
docker run -d -p 8888:8080 tomcat
docker run -d -p 8889:8080 tomcat
使用一个镜像启动三个独立运行的容器(互不干扰)
使用mysql
mysql错误启动方式:
docker run --name mysql01 -d mysql
#此时并没有启动,这个mysql容器会异常退出:
#通过 docker ps -a 指令查看 mysql01 这个容器的状态为: Exited (异常退出)
#查看错误日志:
docker logs mysql01
`You need to specify one of MYSQL_ROOT_PASSWORD, MYSQL_ALLOW_EMPTY_PASSWORD and MYSQL_RANDOM_ROOT_PASSWORD`(这三个参数必须指定一个)
正确启动方式:
#删除之前的错误容器
docker rm mysql01 或 docker rm `这个容器的ID`
#使用 -e 指定参数
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -d mysql
#指定端口映射
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=root -p 3307:3306 mysql
映射端口启动:
#删除之前的错误容器
docker rm mysql01 或 docker rm `这个容器的ID`
#映射端口启动
docker run
进入Docker容器中的mysql:
#进入mysql01容器
docker exec -it mysql01 bash #无任何显示表示成功
mysql -uroot -p
#输入密码~~
解决mysql连接报错 :
#先进入docker中的mysql
docker exec -it mysql01 bash
#输入密码进入
mysql -uroot -p
#输入
select Host,User,plugin from mysql.user;
#然后输入
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
ALTER USER 'vuluser'@'%' IDENTIFIED WITH mysql_native_password BY '密码';
#或者,配置一下/etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
docker启动Redis并设置密码:
docker run -d --name myredis -p 6379:6379 redis --requirepass "mypassword"
数据挂载到本地磁盘启动docker容器
docker run --name edu-mysql -d -p 3307:3306 -v /usr/local/sqlData/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root mysql
docker run -d --privileged=true -p 6380:6379 -v /usr/local/redisData/conf/redis.conf:/etc/redis/redis.conf -v /usr/local/redisData/data/:/data --name edu-redis redis redis-server /etc/redis/redis.conf --appendonly yes
--requirepass "abc123456"
停止所有容器
docker stop $(docker ps -aq)
删除所有容器
docker rm -f $(docker ps -aq)
如何将自己的项目jar包打包成docker 镜像
首先将自己的项目打包成jar,并在自己本地先用java -jar xxx.jar启动下,看是否可以启动。
随后将自己的jar包同级目录创建一个Dockerfile文件,并用notepad打开
文件无后缀。
FROM kdvolder/jdk8
VOLUME /tmp #挂载的docker卷
#xxx.jar 自己的jar包 xxxx.jar 自定义的jar包名
ADD xxx.jar xxxx.jar
#RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/xxxx.jar"] #上面自定义的jar包名称
EXPOSE 项目端口号
将自己的jar包和写好的Dockerfile通过xftp上传到服务器。
切换到 jar包 和 Dockerfile文件 所在路径,执行打包命令
#最后的点不能少
#-t 给新构建的镜像取名
docker build -f Dockerfile -t 镜像名称:版本名 .
#如果不指定镜像名和版本名
#使用下面的命令指定打包完的镜像
docker tag 镜像id eureka-server:latest
启动镜像
docker run -d -p 主机端口号:项目端口号 镜像id
查看镜像日志
docker logs 容器id
docker挂载目录失败/权限拒绝 解决方案
把宿主机的一个目录挂载到容器中的一个目录,当访问容器中的这个目录时,出现无法访问目录,权限拒绝。
该问题通常在centos7下出现。或者一个容器启动成功后,里面的服务无法成功访问,这是因为centos7中的安全模块selinux把权限禁掉了,一般的解决方案有以下两种:
(1)临时关闭selinux
直接在centos服务器上执行以下命令即可。执行完成以后建议重新docker run。
setenforce 0
(2)给容器加权限
在docker run时给该容器加权限,加上以下参数即可:
--privileged=true
一般都推荐使用这种方式。
本文来自博客园,作者:奇怪的阿峰,转载请注明原文链接:https://www.cnblogs.com/zhongyufeng/articles/15120334.html

浙公网安备 33010602011771号