一、Ubuntu安装docker
1.安装
#第一种安装方式
sudo apt install docker.io
docker -v #查看版本
service docker start #启动docker
#第二种安装方式
sudo apt-get remove docker #移除之前安装的docker
#添加 GPG 密钥
curl -fsSL https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu/gpg | sudo apt-key add -
#添加 Docker-ce 软件源
sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu \
$(lsb_release -cs) stable"
apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
#出现问题:在处理时有错误发生:docker-ce;执行下面代码
sudo apt-get check #检查是否有软件包损坏
sudo apt-get install -f docker-ce docker-ce-cli containerd.io
#启动docker
systemctl enable docker --now
注意:一般yum命令在centOS中使用,ubuntu用apt命令安装即可;
2.配置加速
通过docker安装各种软件时,配置镜像加速会可以加快下载速度:
阿里云镜像加速器:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
sudo mkdir -p /etc/docker #有这个目录就不创建
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://baqna0vt.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
二、镜像操作
在docker hub找到对应的镜像
#查看镜像列表
docker images
#搜索镜像,nginx=nginx:latest
docker search nginx
#下载镜像,完整写法:镜像名:版本号【nginx:1.12.0】
docker pull nginx
#删除镜像,完整写法:镜像名:版本号
docker rmi nginx #等同于 docker rmi nginx:latest
三、容器操作
1.命令
1.1.基础启动
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
#运行nginx:latest版本,
#--name=别名,-d 后台运行【后台运行,会打印一串字符】
# --restart=always ,开机自启
#-p 88:80,端口映射【外部端口:nginx内部端口】
docker run --name=mynginx -d --restart=always -p 88:80 nginx
#查看正在运行容器
docker ps
#查看所有容器,包括运行中
docker ps -a
#删除容器,-f 强制删除
docker rm [-f] containerid
#启动/停止运行容器,容器id不一定要写完全,输入能唯一标识该容器的部分id即可
docker start/stop containterID/容器名称
#重启Linux系统
reboot
#更新容器启动项,容器id可以不写全
docker update containerId --restart=always
1.2.进入容器
进入容器,容器内部结构类似于一个小型Linux系统
#以交互方式进入容器内部,打开容器的bash,有的只能进入bin/sh
docker exec -it containerID /bin/bash
#nginx容器内部跳转
cd /usr/share/nginx/html
echo "<h1>hello world</h1>" > index.html
#退出容器内部
exit
1.3.数据挂载
将外部目录【主机目录】挂载到容器内部。
数据挂载选项:-v 外部目录:本地目录:读写模式
读写模式:即容器内部对挂载目录的可操作方式
- rw:默认,可读可写
- ro:只读
#将本地的/data/html挂载到容器的
docker run --name=mynginx -d \
-p 88:80 --restart=always \
-v /data/html:/usr/share/nginx/html:rw
-v /data/conf/nginx.conf:/etc/nginx/nginx.conf:rw \
nginx
注意:
- 挂载后,外部目录文件会覆盖容器内部的,执行数据挂载前可备份容器内部目录数据;
- 对外部文件的修改将会同步到容器内部;
- 在docker hub搜索对应镜像,参考如何选择挂载目录;
1.4.镜像提交
将配置好的nginx容器提交到本地镜像。
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
#-a 指明作者
#-m 提交说明
docker commit -a 'liuly' -m '首页变化' containerid lly:v1.0.0
#保存
docker save [OPTIONS] IMAGE [IMAGE...]
#镜像lly:v1.0.0压缩成abc.tar文件
docker save -o abc.tar lly:v1.0.0
ls #看一下里面有没有abc.tar
#以root用户权限,将abc.tar到指定ip主机的/usr/test目录下;具体问题解决在后面有说明
scp abc.tar root@192.168.XX.XX:/usr/test
#其他主机加载镜像
docker load -i abc.tar
1.5.镜像推送
将镜像推送到docker hub。
首先需要注册一个docker hub的账号;
登录docker hub后创建一个仓库【create a repository】
#推送命令
docker tag local-image:tagname new-repo:tagname
docker push new-repo:tagname
docker tag lly:v1.0.0 liulinyu/llynginx:v1.0.0
docker login #输入docker hub的用户名和密码登录
docker push liulinyu/llynginx:v1.0.0
1.6.其他命令
#查看日志
docker logs containerID
#容器内部文件复制到外部;将前后位置对调,实现外部->容器内部复制
docker cp containerID:/etc/nginx/nginx.conf /data/conf/nginx.conf
2.进阶
2.1.创建SpringBoot应用
准备:新建Spring Boot应用,选择Web和Redis相关依赖;创建项目后将无用的文件删除;【记得在IDEA右下方提示将项目Load Maven Project,或右击项目名Add as Maven Project】
Controller代码:
package com.atlly.javademo.controller;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class CounterController {
@Resource
RedisTemplate redisTemplate;
@GetMapping("/hello")
public String count() {
Long count = redisTemplate.opsForValue().increment("count_people");
return "有【" + count + "】人访问过该网页";
}
}
配置文件:
spring.redis.host=192.168.XXX.XXX
spring.redis.password=XXX
2.1.1.docker部署redis应用
#下载redis
docker pull redis
#主机创建redis.conf
cd /data/redis
vim redis.conf #写入appendonly yes
#以加载自定义配置文件方式启动redis[redis-server /etc/redis/redis.conf]
docker run -v /data/redis/redis.conf:/etc/redis/redis/conf \
-v /data/redis/data:/data
-d --name myredis \
-p 6379:6379 \
redis redis-server /etc/redis/redis.conf
测试:使用 Another Redis Desktop Manager或其他Redis桌面管理工具测试连接;
配置Redis访问密码:
vim /data/redis/redis.conf
#添加下面这行,设置密码,并保存修改
requirepass 123456
#重启容器,重新测试连接redis容器
docker restart myredis
2.1.2.docker打包
Dockerfile写法:
#基础运行环境,从docker hub上选择镜像
FROM IMAGE
#镜像作者,一般姓名加邮箱
MAINTAINER authorName<AuthorEmail>
#镜像运行时执行的命令
RUN
# 拷贝文件(支持正则表达式)到镜像,并自动解压(如果是压缩包)
ADD
#镜像工作目录
WORKDIR
#挂载目录
VOLUME
#端口配置
EXPOSE 9001
# 镜像启动命令,只有最后一个会生效,可被替代。
CMD
# 镜像启动命令
ENTRYPOINT
# 拷贝,将本机指定目录的文件复制到镜像中
COPY
# 设置环境变量
ENV
在创建的SpringBoot项目:
- 打包项目:mvn install,mvn compile,mvn package;执行这几个操作后,在target生成java-demo-0.0.1=SNAPSHOT.jar包
- 创建Dockerfile,与target同级,内容如下:
#基础运行环境 ,
FROM openjdk:11-jdk-slim
#maintainer指明镜像作者
LABEL maintainer=liuly
#将jar复制到指定位置
COPY target/*.jar /app.jar
#镜像启动命令
ENTRYPOINT ["java","-jar","/app.jar"]
如果Windows没有配置Docker,不能使用docker打包,将项目的target文件夹和Dockerfile文件上传到配置了docker的Linux服务器中,进行构建。
在Windows 命令行跳转到指定目录,并执行下面命令:
#将当前目录的target文件夹和Dockerfile文件复制到192.168.XX.XX主机上的/test目录下
scp -r target Dockerfile root@192.168.XXX.XXX/test
远程复制到Linux服务器后,在Linux服务器终端:
cd /test
#-t imageName,指定镜像名称:版本号
#-f Dockerfile,指定dockerfile文件,在当前目录下,且名字一致,可忽略该项
# .,这个点表示在当前目录下工作
docker build -t lly-java-demo:v1.0 -f Dockerfile .
#查看本地下载镜像中,是否有构建好的镜像
docker images
#启动容器,访问192.168.XXX.XXX:8080/hello
docker run -d -p 8080:8080 --name=mydemo lly-java-demo:v1.0
#如果启动之后,运行几秒就退出,查看容器日志
docker logs CONTAINERID
#推送到docker hub
docker tag lly-java-demo:v1.0 liulinyu/lly-jd:1.0
docker push liulinyu/lly-jd:1.0
#其他主机下载
docker pull liulinyu/lly-jd:1.0
问题:启动容器之后,过一会儿就退出了。可能是应用有问题,使用docker logs查看日志,发现错误:
Error:Unable to access jarfile java-demo-0.0.1-SNAPSHOT.jar
原因:在配置Dockerfile时,ENTRYPOINT的jar写错
解决:将ENTRYPOINT的jar包改成与COPY后的/app.jar,才能扫描到;
四、其他操作
初始化root密码
#输入登录用户密码;输入新的root密码;再确认新密码
sudo passwd root
复制文件到远程主机
scp abc.tar root@192.168.XX.XX:/usr/test/
#提示:ssh:connect to 192.168.XX.XX port 22:Connectin refused
#解决:在本机和远程主机安装openssh-server
apt-get install openssh-server
问题:ssh登录到远程主机的root用户,密码正确,但是提示:permission denied,please try again
原因:ssh可以登录远程主机的普通用户,但是root用户默认设置是禁止访问的。将配置修改一下,运行其远程访问即可。
解决:
#不要找错了,是sshd_config,不是ssh_config
cat /etc/ssh/sshd_config|grep PermitRootLogin
将PermitRootLogin 对应项改成 yes
vim /etc/ssh/sshd_config
#将PermitRootLogin值修改为yes
#重启sshd服务
service sshd restart