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 commit
和docker 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