容器化-Docker

一、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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值