1. 首页
  2. 后端

Docker快速上手

  Docker快速上手

==========

云原生可以理解为将原生的编程语言(Java、Python、C、C++)等,部署到云上,以及云部署后的一系列解决方案

Docker 快速上手

Docker 简介

Docker 最大的作用在于统一标准,因为编程语言众多,如 Java 打包后生成.jar文件,Python 可以打包为.exe文件,前端项目构建后又会生成.html文件等,这种不统一的应用构建方式使得部署极为繁琐,要针对不同的应用配置部署环境

Docker 则能解决以上问题,其通过镜像的概念,将不同的应用及其运行环境都构建为统一的镜像,我们只需要统一的运行镜像即可运行其他任意不同种类的应用程序

Docker 安装&卸载

安装 gcc 相关

yum -y install gcc
yum -y install gcc-c++

卸载旧版 docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

配置 yum 源

yum install -y yum-utils

yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

安装 docker

yum install -y docker-ce docker-ce-cli containerd.io

启动 docker !

systemctl start docker

配置 docker 开机自启

systemctl enable docker

配置镜像加速

  • 注册阿里云账号
  • 搜索镜像加速
  • 找到镜像加速服务,复制专属镜像加速地址
  • 修改配置文件
vim  /etc/docker/daemon.json
  • 添加镜像加速配置
{
  "registry-mirrors": ["https://wachdbbo.mirror.aliyuncs.com"]
}
  • 重新加载daemon.json
systemctl daemon-reload
  • 重启 docker 服务
systemctl restart docker

卸载 docker

systemctl stop docker 
yum -y remove docker-ce
rm -rf /var/lib/docker

Docker 镜像操作

查找镜像

nginx – Official Image | Docker Hub 上可以检索自己需要的镜像

下载镜像

查找到镜像后,可以通过docker pull拉取镜像,如下,默认会拉取最新版本的镜像,也就是latest版本

“`
docker pull nginx

“`

如果需要下载指定的镜像版本,可以通过如下形式的命令

“`
docker pull redis:6.2.4 # 通过 name:xxx 的形式指定版本号

“`

查看所有下载的镜像

docker images

删除镜像

docker rmi name:xxx

如果直接使用docker rmi redis形式,会直接删除redis:latest版本

同时也可以直接使用docker rmi imageid来删除镜像,imageid可以通过docker images查看

Doker 容器操作

启动容器

# [command] 参数指的是镜像启动运行的命令,这在镜像中默认是有的,所以此参数不常用
# [optins] 为 docker 启动时的设置项
docker run [optinos] images_name [command] [arg...]

注意,当执行docker run命令后,会 新建 并启动一个容器 实例

关于docker run[options]参数,有如下常用选项

--name="" # 为容器实例指定一个名称
-d # 后台运行容器,并返回容器ID,也即启动守护式容器
-i # 以交互模式运行容器,通常与 -t 同时使用
-t # 为容器重新分配一个伪输入终端,通常与 -i 同时使用
-P # 随机端口映射
-p # 指定端口映射,有以下四种格式
    ip:hostPort:containerPort
    ip::containerPort
    hostPort:containerPort
    containerPort
--restart=always # docker 启动时,此容器自启

容器实例--name指定的名称不能重复,如果下次创建其他容器实例时需要使用已有的实例名称,则需要先通过如下命令删除已经存在的容器(删除容器之前需要先停止容器)

“`

删除指定的容器id对应的容器,对应的容器id可以通过上面提到过的 docker ps 命令查看

docker rm container_id

或者直接使用容器名称也可以删除

docker rm name

“`

如果要删除运行中的容器,可以使用-f参数,如下

“`
docker rm -f container_id

“`

查看容器

docker ps # 查看运行的容器
docker ps -a # 查看所有容器

查看日志

docker logs [OPTIONS] container_id # 查看容器日志
-t # 加入时间戳
-f # 跟随最新的日志打印
--tail value # value,显示最后多少条

停止运行的容器实例

docker stop container_id

再次启动已经创建的容器实例

只要执行过docker run,那么就会生成容器实例,下次运行时,只需要执行如下命令

docker start container_name
# 或者
docker start container_id

容器首次docker run时指定的参数,例如--name -d等也会在对应的容器实例中保留,启动时无需重新配置

补充

注意 Docker 中容器镜像的区别,通过一个镜像可以创建一个或多个容器实例,镜像相当于容器是一种抽象,好比Java中类与对象的关系

容器端口映射

对于一个已经启动容器,其对应的应用实例是运行在容器内部的Linux环境下的,每一个容器实例都可以理解为一个最小化的Linux系统

正因为应用运行在容器内部的Linux环境中,其运行端口也在容器内部的Linux环境,如果我们直接通过外部的主机端口去访问运行的容器实例显然是不可行的,这就需要配置容器端口映射

容器端口映射可以理解为将容器实例中的Linux运行环境的端口,映射到外部的主机某个端口,之后我们对主机某个端口的访问都会被映射到容器实例的对应端口,这样就能访问容器中运行的应用实例了

容器端口映射的命令如下,以创建一个redis实例为参照

# 其中 -p 参数代表指定端口映射,左边的端口指定主机端口,右边的端口指定将主机的端口映射到容器实例的那个一个端口
# 之后直接通过 主机的ip:6379 即可访问到运行在容器实例中的 redis
docker run --name=myredis -d --restart=aways -p 6379:6379

进入容器修改内容

正常情况下,容器运行时的内部细节我们不用关心,但有时候会涉及到需要修改容器中应用的配置时,比如需要将前端部署到 nginx 容器的html目录下,我们可以直接进入容器内部进行修改,使用如下命令

# 进入指定容器id的控制台
docker exec -it contatiner_id /bin/bash

某些容器的控制台可能是 sh , 如果 bash 不能用的话 , 可以尝试 sh

进入容器内部后,操作的方式和传统的Linux系统一致,只不过容器环境下的Linux系统是最小化的,缺少一些经常使用的工具,如vim

具体的自定义化的配置,可以参考docker hub官网对应镜像的描述

操作完容器内部后,想要返回到虚拟主机的bash,直接执行exit即可

修改容器

对应已有的容器,可以使用如下目录进行修改

docker update [OPTIONS] CONTAINER [CONTAINER...]

具体使用

docker update --restart=always container_id

提交改变

上面我们自定义修改了容器中的内容,现在想要将这种改变后的容器保存,以便下次docker run一个容器实例时,能够保留这种改变,通过如下命令

# 将一个改变后的容器实例提交为一个镜像
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

具体使用如下

# 使用 docker commit 提交镜像的改变
# -a 参数指定提交的作者
# -m 参数指定提交的描述信息
# container_id 指定修改镜像的容器id
# 最后跟上提交后的镜像仓库名称以及版本号
docker commit -a 'dhj' -m 'nginx 首页修改' container_id update_nginx:1.0

镜像保存

如果说我们自定义的镜像需要提供给其他的主机使用,那么镜像的内容应该怎么传输?

Docker 提供了将镜像打包的方式,如下

docker save [OPTIONS] IMAGE [IMAGE...]

具体使用如下

# 将指定镜像打包为 wrap.tar
# -o 参数指定打包的名称(打包的文件格式为 .tar)
docker save -o wrap.tar image_id

默认会将镜像打包后的文件保存到当前目录下

之后我们可以直接将该镜像打包后的的.tar文件传输给其他主机,其他主机接收到镜像后,可以通过如下命令加载这个镜像

docker load [OPTIONS]

具体使用如下

docker load -i wrap.tar

推送到远程镜像仓库

上面通过将镜像打包的方式,用于镜像的一个保存和传输,实际上还可以直接把镜像推送到docker hub的远程仓库,这样更加方便,使用时,直接从仓库docker pull即可

要将镜像推送到 DockerHub,首先需要注册 DockerHub 的账号以及验证邮箱

之后需要创建一个 DockerHub 的仓库,后续的镜像可以推送到此仓库,镜像的推送需要用到如下命令

# 使用 docker tag 来将本地的镜像设置为一个指定镜像仓库的新镜像
docker tag docker.io/redis dhj4612/demo:1.0
# 需要先登录后才能推送到远程的镜像仓库(注意输入 username 时一定使用登录的用户名,而不是登录时的邮箱和手机号等方式)
docker login
docker push dhj4612/demo:1.0 # 推送镜像到远程仓库

注意,一个镜像仓库下只能被推送一次,

实际上直接使用docker commit提交一个更改后的镜像,只要镜像的name对应上远程的镜像仓库名称,那么该镜像也能push到远程镜像仓库中,如下

# 将一个更改后的容器实例提交为一个指定[仓库:版本]的镜像 , 之后可以直接将该镜像 push 到对应的远程仓库
docker commit -a 'dhj' -m 'demo' container_id repository:xxx

docker commitdocker tag的区别在于

  • docker commit可以在提交时,可以直接指定仓库和版本号,这样生成的镜像可以直接提交远程仓库
  • docker tag是将一个已经存在的镜像设置为指定的仓库和版本号,之后才能提交远程仓库

挂载

之前是通过进入容器内部修改内容的,现在可以通过挂载的方式,这和端口映射类似,将容器内部的某个目录或文件挂载到主机,实现主机和容器之间指定挂载数据的同步(双向绑定),命令如下(以 nginx 容器为例)

# -v 参数,指定挂载的目录或文件,格式为 [主机目录或文件:容器目录或文件:ro或rw] 代表容器对挂载目录的权限,ro为只读 rw可读写
docker run --name=nginx-demo -d -p 80:80 -v /opt/nginx/html:/usr/share/nginx/html:ro nginx

之后只需要在主机的/opt/nginx/html目录下修改内容,即可随时同步到容器中

其余常用容器命令

# 查看容器运行日志
docker logs container_id
# 把容器指定位置的东西复制出来 
docker cp 5eff66eec7e1:/etc/nginx/nginx.conf  /data/conf/nginx.conf
# 把外面的内容复制到容器里面
docker cp  /data/conf/nginx.conf  5eff66eec7e1:/etc/nginx/nginx.conf

Docker 实战

redis 部署

docker run -d --name redis -v /opt/servers/redis/redis.conf:/etc/redis/redis.conf -v /opt/servers/redis/data:/etc/redis/data -p 6379:6379 redis redis-server /etc/redis/redis.conf

redis-server /etc/redis/redis.conf代表的是容器启动时执行的目命令,这里是指定的是启动加载的配置文件(配置文件在容器内部)

mysql 部署

docker run --name mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:latest

常用命令

# 导出全部数据
docker exec {container_id} sh -c 'exec mysqldump --all-databases -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库数据
docker exec {container_id} sh -c 'exec mysqldump --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql
# 导出指定库数据不要数据
docker exec {container_id} sh -c 'exec mysqldump --no-data --databases 库表 -uroot -p"$MYSQL_ROOT_PASSWORD"' > /root/all-databases.sql

nginx 部署

docker pull nginx
docker run -p 80:80 --name nginx -d nginx
# 准备目录
mkdir -p /root/nginx/html
# 复制配置文件
docker cp {container_id}:/etc/nginx/nginx.conf /root/nginx
# 重新运行镜像,使用宿主机的 .conf 配置文件和 html 资源目录
docker run --name nginx -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx

html 目录中需要存在 index.html 文件,否则访问 nginx 默认页时,会显示 403

mongoDb 部署

docker pull mongo
# 准备目录
mkdir -p /root/mongodb/data
# 挂在数据目录到宿主机,指定用户名和密码
docker run --name mongodb -v /root/mongodb/data:/data/db -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=111111 -p 27017:27017 -d mongo

打包镜像

如果要使用 docker 打包某一应用及其环境,需要先创建Dockerfile文件。在其中编写打包的规则,如下

# 指定应用的基础运行环境
FROM openjdk:11-jdk-slim
# 指定镜像作者
LABEL maintainer=dhj
# 构建镜像时,将当前 target 目录下的所有的 jar 包复制为 linux 环境中的 /app.jar
COPY target/*.jar /app.jar
# 配置容器启动时运行的命令。除此之外还有 CMD 和 RUN 指令也能够配置
ENTRYPOINT ["java","-jar","/app.jar"]

无注释版如下

FROM openjdk:11-jdk-slim
LABEL maintainer=dhj
COPY target/*.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

构建 docker 镜像(需要提前安装 docker 环境)

# 使用 docker build 构建镜像, -t 指定镜像的名称和版本, -f 可以指定 Dockerfile 文件(如果文件名称就叫 Dockerfile 则默认可以不写)
# 最后的 . 代表此命令的执行环境为当前目录
docker build -t count-demo:1.0 -f Dockerfile .

如果构建成功,会出现Successfully built xxxxxx字样

镜像构建成功后可以直接使用docker run运行该镜像

apache-rocket-mq 部署

idea 远程连接 docker

之后在 idea 设置中搜索 docker,选择对应连接类型进行连接,分别有

  • TCP 连接(需要配置证书进行安全连接,比较麻烦)
  • SSH 连接
  • WSL 连接

如果使用 WSL 安装的 Docker,想要使用 SSH 连接,可能需要先配置 ssh-server,否则可能默认无法通过 ssh 方式连接 docker,执行如下命令

# 删除默认的 ssh-server
sudo apt purge openssh-server
# 重新安装 ssh-server
sudo apt install openssh-server
# 重启 ssh-server
sudo service ssh restart
# 查看启动状态
service ssh status

最后将 ssh-server 设置为开机自启

sudo systemctl enable ssh

Dockerfile

DockerCompose

docker-compose 下载 Releases · docker/compose (github.com)

将下载的二进制文件放在 /user/local/bin目录下

赋予 docker-compose 文件权限

sudo chmod +x /usr/local/bin/docker-compose

检查是否安装成功

docker-compose --version

原文链接: https://juejin.cn/post/7388908751258746915

文章收集整理于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除,如若转载,请注明出处:http://www.cxyroad.com/17240.html

QR code