Docker在Linux环境下常见部署

Docker是一个开源的应用容器引擎,让开发者可以打包应用及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上。使用Docker可以更方便地打包、测试以及部署应用程序。

Docker安装

安装yum-utils

1
yum install -y yum-utils device-mapper-persistent-data lvm2

为yum源添加docker仓库位置

1
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

安装Docker

1
yum install docker-ce

启动Docker

1
systemctl start docker

自启动Docker

1
systemctl enable docker

查看Docker版本

1
docker -v

查看Docker信息

1
docker info

查看Docker帮助

1
docker help

查看Docker状态

1
systemctl status docker

配置Docker镜像加速器

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://fsfhxt97.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

重启Docker

1
systemctl restart docker

防火墙配置

默认情况下,当docker启动容器映射端口时,会直接使用iptables开启添加端口

查看防火墙状态

1
systemctl status firewalld

重启防火墙

1
systemctl restart firewalld

自启防火墙

1
systemctl enable firewalld

查看开放端口

1
firewall-cmd --list-port

开放端口

1
firewall-cmd --zone=public --add-port=80/tcp --permanent

重载防火墙

1
firewall-cmd --reload

Docker命令

Docker镜像常用命令

搜索镜像

1
docker search java

下载镜像

1
docker pull java:8

查看镜像版本

docker search命令只能查找出是否存在该镜像,不能找到该镜像支持的版本,所以我们需要docker hub官网来搜索支持的版本

查看镜像

1
docker images

删除镜像

1
docker rmi java:8

强制删除指定名称镜像

1
docker rmi -f java:8

删除所有没有使用的镜像

1
docker rmi `docker images | grep none | awk '{print $3}'`

强制删除所有镜像

1
docker rmi -f $(docker iamges)

打包镜像

1
2
# -t 表示指定:镜像仓库名称/镜像名称:镜像标签	.表示使用当前目录下的dockerfile文件
docker build -t ${group_name}/${app_name}:${app_version} .

推送镜像

1
2
3
4
5
6
# 登录Docker hub
docker login
# 将本地镜像标签为远程仓库名称
docker tag ${group_name}/${app_name}:${app_version} ${docker_group_name}/${app_name}:${app_version}
# 推送远程仓库
docker push ${docker_group_name}/${app_name}:${app_version}

Docker容器常用命令

新建并启动容器

1
2
3
4
docker run -p 80:80 --name nginx \
-e TZ="Asia/Shanghai" \
-v /mydata/nginx/html:/usr/share/nginx/html \
-d nginx:1.17.0
  • -p:将宿主机和容器端口进行映射,格式为:宿主机端口:容器端口
  • –name:指定容器名称,可以通过容器名称来操作容器
  • -e:设置容器的环境变量,TZ设置的是时区
  • -v:将容器上的文件挂载到宿主机上,格式为:宿主机文件目录:容器文件目录
  • -d:容器以后台方式运行

列出容器

列出运行中的容器
1
docker ps
列出所有容器
1
docker ps -a

停止容器

1
2
3
# $ContainerName表示容器名称,$ContainerId表示容器ID,
docker stop $ContainerName
(or docker stop $ContainerId)

强制停止容器

1
docker kill $ContainerName

启动容器

1
docker start $ContainerName

重启容器

1
docker restart $ContainerName

进入容器

查询容器的pid:
1
docker inspect -f "{{.State.Pid}}" $ContainerName
根据容器的pid进入容器:
1
nsenter -t "$pid" --mount --uts --ipc --net --pid

删除容器

删除指定容器
1
docker rm $ContainerName
强制删除指定容器
1
docker rm -f $ContainerName
按名称通配符删除容器

删除以名称demo-开头的容器

1
docker rm `docker ps -a | grep demo-* | awk '{print $1}'`
强制删除所有容器
1
docker rm -f ${docker ps -a -q}

查看容器日志

查看容器产生的全部日志
1
docker logs $ContainerName
动态查看容器的日志
1
docker logs -f $ContainerName

查看容器IP地址

1
docker inspect -f '{{.NetworkSettings.IPAddress}}' $ContainerName

修改容器的启动方式

1
2
# 将容器启动方式修改为always
docker container update --restart=always $ContainerName

同步宿主机时间到容器

1
docker cp /etc/localtime $ContainerName:/etc/

查看容器资源占用状态

查看指定容器资源占用状态,比如cpu、内存、网络、io状态
1
docker stats $ContainerName
查看所有容器资源占用情况
1
docker stats -a
查看容器磁盘使用情况
1
docker system df

执行容器内部命令

1
docker exec -it $ContainerName /bin/bash

指定账号进入容器内部

1
2
# 使用root账号进入容器内部
docker exec -it --user root $ContainerName /bin/bash

查看所有网络

1
docker network ls

image-20230109140922874

创建外部网络

1
docker network create -d bridge my-bridge-network

指定容器网络

1
2
3
docker run -p 80:80 --name nginx \
--network my-bridge-network \
-d nginx

修改镜像存放位置

查看Docker镜像的存放位置
1
docker info | grep "Docker Root Dir"
关闭Docker服务
1
systemctl stop docker
移动原镜像文件至目标目录
1
mv /var/lib/docker /mydata/docker
建立软连接
1
ln -s /mydata/docker /var/lib/docker

image-20230109151125629

image-20230109151133080

Docker容器清理

查看Docker占用磁盘空间情况

1
docker system df

删除所有关闭的容器

1
docker ps -a | grep Exit | cut -d ' ' -f 1 | xargs docker rm

删除所有虚悬(dangling)镜像(没有Tag的镜像)

1
docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

删除所有虚悬(dangling)数据卷

1
docker volume rm $(docker volume ls -qf dangling=true)

Docker容器安装

MySQL安装

拉取MySQL镜像

1
docker pull mysql

运行MySQL容器

1
2
3
4
5
6
7
docker run -p 3306:3306 --name mysql \
-v /mydata/mysql/data:/var/lib/mysql \
-v /mydata/mysql/conf:/etc/mysql \
-v /mydata/mysql/log:/var/log/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--restart=always \
-d mysql

运行MySQL的docker容器

1
docker exec -it mysql /bin/bash

打开MySQL客户端

1
mysql -uroot -proot --default-character-set=utf8

创建一个账号并修改权限

1
grant all privileges on *.* to 'reader'@'%' identified by '123456';

创建数据库

1
2
3
4
5
6
7
8
9
# 创建数据库
create datebase ${dabebase} character set utf8
# 安装上传下载插件并将sql文件上传到Linux服务器中的/mydata目录
yum -y install lrzsz
# 拷贝sql文件至mysql容器
docker cp /mydata/*.sql mysql:/
# 将sql文件导入数据库
use ${dabebase}
source /*.sql

Redis安装

拉取Redis镜像

1
docker pull redis

运行Redis容器

1
2
3
4
docker run -p 6379:6379 --name redis \
-v /mydata/redis/data:/data \
--restart=always \
-d redis redis-server --appendonly yes --requirepass "root"

进入Redis容器

1
2
3
4
docker exec -it redis /bin/bash
redis-cli
auth root
# 或者 docker exec -it redis redis-cli

Nginx安装

拉取Nginx镜像

1
docker pull nginx

运行Nginx容器

1
2
3
4
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-d nginx

拷贝配置文件至指定目录

1
docker container cp nginx:/etc/nginx /mydata/nginx/

修复文件名称

1
2
cd /mydata/nginx/
mv nginx conf

销毁容器

1
docker rm -f nginx

运行Nginx容器

1
2
3
4
5
6
7
docker run -p 80:80 --name nginx \
-v /mydata/nginx/html:/usr/share/nginx/html \
-v /mydata/nginx/logs:/var/log/nginx \
-v /mydata/nginx/conf:/etc/nginx \
-v /home/apps/home/apps \
--restart=always \
-d nginx

Jenkins安装

拉取Jenkins镜像

1
docker pull jenkins/jenkins

运行Jenkins容器

1
2
3
4
5
6
docker run --name jenkins \
-p 8090:8080 -p 50000:5000 \
-u root \
-v /mydata/jenkins_home:/var/jenkins_home \
--restart=always \
-d jenkins/jenkins

RabbitMQ安装

拉取RabbitMQ镜像

1
docker pull rabbitmq:3.9-management

创建用于挂载目录并修改权限

1
2
mkdir -p /mydata/rabbitmq/{data,conf,log,plugins}
chmod -p 777 /mydata/rabbitmq

运行RabbitMQ容器

1
2
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-d rabbitmq:3.9-management

复制文件到宿主机

1
2
docker cp rabbitmq:/etc/rabbitmq/ /mydata/rabbitmq/conf
docker cp rabbitmq:/opt/rabbitmq/plugins /mydata/rabbitmq/

强制删除容器

1
docker rm -f rabbitmq

重新运行容器

1
2
3
docker run -p 5672:5672 -p 15672:15672 --name rabbitmq \
-v /mydata/rabbitmq/plugins:/plugins \
-d rabbitmq:3.9-management

Dockerfile

使用DockerFile来构建docker镜像

Dockerfile常见命令

FROM

指定所需依赖的基础镜像

1
2
3
FROM <image>:<tag>
# 该镜像需要依赖的java8的镜像
FROM java:8

ADD

用于复制文件

1
2
3
ADD <src> <dest>
# 将当前目录下的demo.jar包复制到docker容器的/目录下
ADD demo.jar /demo.jar

RUN

在容器构建过程中执行的命令,我们可以用该命令自定义容器的行为,比如安装一些软件,创建一些文件等

1
2
3
4
RUN <command>
RUN ["executable", "param1","param2"...]
# 在容器构建过程中需要在/目录下创建一个demo.jar文件
RUN bash -c 'touch /demo.jar'

EXPOSE

声明需要暴露的端口(只声明不打开端口)

1
2
3
EXPOSE <port1> <port2> ...
# 声明服务运行在8080端口
EXPOSE 8080

ENV

用于设置环境变量

1
2
3
ENV <key> <value>
# mysql运行时设置root密码
ENV MYSQL_ROOT_PASSWORD root

ENTRYPOINT

指定docker容器启动时执行的命令

1
2
3
ENTRYPOINT ["executable", "param1","param2"...]
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java","-jar","/demo.jar"]

MAINTAINER

指定维护者的名字

1
2
MAINTAINER <name>
MAINTAINER xiaoyuanjw

构建应用镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 该镜像需要依赖的基础镜像
FROM java:8
# 将当前目录下的jar包复制到docker容器的/目录下
ADD demo.jar /demo.jar
# 运行过程中创建一个demo.jar文件
RUN bash -c 'touch /demo.jar'
# 声明服务运行在8080端口
EXPOSE 8080
# 指定docker容器启动时运行jar包
ENTRYPOINT ["java", "-jar","/demo.jar"]
# 指定维护者的名字
MAINTAINER xiaoyuanjw

Docker Compose

Docker Compose安装

下载Docker Compose

1
curl -L https://get.daocloud.io/docker/compose/releases/download/1.24.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

修改文件权限可执行

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

查看是否已经安装成功

1
docker-compose --version

Docker Compose步骤

  • 使用Dockerfile定义应用程序环境,一般需要修改初始镜像行为时才需要使用
  • 使用Docker-Compose.yml定义需要部署到应用程序以便执行脚本一次性部署
  • 使用Docker-Compose up命令将所有的应用服务一次性部署起来

Docker-compose.yml常见命令

image

指定运行的镜像名称

1
2
# 运行的是mysql5.7的镜像
image: mysql:5.7

container_name

配置容器名称

1
2
# 容器名称为mysql
container_name: mysql

ports

指定宿主机和容器的端口映射(HOST:CONTAINER)

1
2
3
# 将宿主机的3306端口映射到容器的3306端口
ports:
- 3306:3306

volumes

将宿主机的文件或目录挂载到容器中(HOST:CONTAINER)

1
2
3
4
5
# 将外部文件挂载到myql容器中
volumes:
- /mydata/mysql/log:/var/log/mysql
- /mydata/mysql/data:/var/lib/mysql
- /mydata/mysql/conf:/etc/mysql

environment

配置环境变量

1
2
3
# 设置mysqlroot帐号密码的环境变量
environment:
- MYSQL_ROOT_PASSWORD=root

连接其他容器的服务(SERVICE:ALIAS)

1
2
3
# 可以以database为域名访问服务名称为db的容器
links:
- db:database

Docker Compose常见命令

构建、创建和启动相关服务

1
2
# -d表示在后台运行
docker-compose up -d

指定文件启动

1
docker-compose -f docker-compose.yml up -d

停止所有相关容器

1
docker-compose stop

列出所有容器信息列出所有容器信息

1
docker-compose ps