君匡

V1

2022/07/22阅读:16主题:自定义主题1

Docker系列一安装Docker

前言

重新换了服务器,要在centOS7上面安装Docker

其实安装Docker分为两种,一种是在线安装也就是本文介绍的内容;另一种是离线安装,适合没有办法联网的伙伴,详情可以直接查看文末的推荐链接。

安装Docker

Docker 要求 CentOS 系统的内核版本高于 3.10 ,验证你的CentOS 版本是否支持 Docker 。

#查看你当前的内核版本
uname -r

安装需要的软件包。

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

设置安装的源。

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

建议直接下载最新稳定版,当然也可以下载指定版本。

#下载最新版本
sudo yum install docker-ce -y

#查看所有版本
yum list docker-ce --showduplicates | sort -r
#下载17.12.0版本的
yum install docker-ce-17.12.0.ce

启动并加入开机启动

#启动
systemctl start docker

#开机自启
sudo systemctl enable docker

使用语句查看已经自启的服务,如果列表中存在即为设置成功:

systemctl list-unit-files | grep enable

到这里,完成了安装。

配置Docker

修改源为中科大的镜像源,修改/etc/docker/daemon.json文件内容为:

{"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]}

保存后,重启Docker,查看是否成功。

#重启
systemctl daemon-reload
systemctl restart docker

#查看docker状态
systemctl status docker

#查看docker配置
docker info

到这里就完成了配置。

使用Docker

这里以安装Mysql为例,进行讲解。

拉取镜像到本地

用Root账户搜寻想要的镜像,一般是选择标星最多的。

# 登陆root账户
sudo -i

#搜寻镜像
docker search mysql

#拉取镜像
sudo docker pull mysql

当然,如果不想要最新版本的,你也可以选择列出Tags。

# RepoName默认为官网docker库,镜像名为mysql,结果显示所有支持的tags
export RepoName=https://registry.hub.docker.com \
 && export ImagesName=mysql \
 && wget -q $RepoName/v1/repositories/$ImagesName/tags -O -  | sed -e 's/[][]//g' -e 's/"//g' -e 's/ //g' | tr '}' '\n'  | awk -F: '{print $3}' | sort -u

然后你选择删除已经下载的镜像,重新拉取指定版本的镜像。

# 拉取指定版本的镜像
docker pull mysql:5.7.30

# 查看镜像
docker images

得到结果为:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
mysql        latest    3218b38490ce   7 months ago   516MB
mysql        5.7.30    9cfcce23593a   2 years ago    448MB

于是删除镜像

docker rmi 3218b38490ce

创建外部挂载目录

在用镜像创建容器之前,建议创建存储目录,来保存容器中的数据和配置信息,免得未来重启容器后就丢失数据了。

# 自定义新建的目录名
export MysqlName=mysql-5.7

# 指定配置目录、数据目录
mkdir -p /home/keen/docker/$MysqlName/conf
mkdir -p /home/keen/docker/$MysqlName/data

# 赋予权限
chmod -R 755 /home/keen/docker/$MysqlName/conf

配置容器

/home/keen/docker/mysql-5.7/conf/下创建文件my.cnf

vim /home/keen/docker/$MysqlName/conf/my.cnf

#先按`i`,底下出现一个"Insert"的文字。

复制内容如下,到命令行里黏贴。

[mysqld]
user=mysql
max_connections=1000
skip-name-resolve
character-set-server=utf8
default_authentication_plugin=mysql_native_password
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

之后按esc键退出编辑模式;再输入英文冒号和字母组合:wq保存并退出。

启动容器

docker run \
    --name mysql5.7.30 \
    -p 4306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d \
    --restart=always \
    --privileged=true \
    -v /home/keen/docker/mysql-5.7/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/keen/docker/mysql-5.7/data/:/var/lib/mysql \
    mysql:5.7.30
  • --name mysql5.7.30:容器名字为mysql5.7.30

  • -p 4306:3306 :映射宿主机的 4306 端口到容器服务的 3306 端口,本地就可以直接通过宿主机ip:4306访问到 MySQL 的服务。

  • -e MYSQL_ROOT_PASSWORD=123456:设置 MySQL 服务 root 用户的密码。

  • -d:后台运行

  • --restart=always:Docker 重启的时候容器也会重启

  • –privileged=true:容器内的root拥有真正root权限,否则容器内root只是外部普通用户权限

  • -v /home/keen/docker/mysql-5.7/conf/my.cnf:/etc/mysql/my.cnf映射配置文件

  • -v /home/keen/docker/mysql-5.7/data/:/var/lib/mysql:映射数据目录

  • 使用镜像mysql的5.7.30版本

使用容器

# 进入容器
docker exec -it  mysql5.7.30  /bin/bash

# 进入数据库
mysql -u root -p
123456

新建用户

在远程服务器上面建立远程用户名为keenuser的用户,密码为123456。中间有踩过坑,新建的用户如果是localhost是无法远程登录的。

# 远程用户
create user keenuser@'%' identified by '123456'; 

#注意如果是localhost,则无法远程登录
create user keenlocaluser@localhost identified by '123456'; 
#删除本地用户
DROP USER 'keenuser'@'localhost';

新建数据库

建立一个数据库名字叫做nextcloud

# 新建数据库
create database nextcloud DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

#授权在数据库nextcloud上面的所有权力给名为keenuser的用户
grant all privileges on nextcloud.* to keenuser@'%'; 

#刷新
flush privileges; 

#退出Mysql
exit;

退出容器

#退出容器
exit;

停止与删除容器

停止并且销毁容器。

# 停止容器
docker stop  mysql5.7.30 

# 销毁容器
docker rm mysql5.7.30 

# 强制销毁容器
docker rm -f mysql5.7.30 

#停止并且销毁自定义容器
export TempName=mysql5.7.30 
docker stop $TempName && docker rm $TempName

本地连接数据库

在本地连接远程服务器的数据库。

navicat

新建一个链接,如图即可测试成功。

Dbeaver

新建一个链接,输入信息后点击测试链接即可。

修改容器配置

修改端口

以上文的Mysql容器为例, 其中的8bb**是容器的ID值,。

# 查看对应的ID
docker ps -a

#修改容器的配置文件
vim /var/lib/docker/containers/8bb0da5913626b58bca7335c446657c22ff09e309c85ae745d9fdbc4b5308f4c/hostconfig.json 

打开文件后可以找到PortBindings字段,即可修改端口映射。

{
    "Binds": [
        "/home/keen/docker/mysql-5.7/data/:/var/lib/mysql",
        "/home/keen/docker/mysql-5.7/conf/my.cnf:/etc/mysql/my.cnf"
    ],
    "ContainerIDFile""",
    "LogConfig": {
        "Type""json-file",
        "Config": {}
    },
    "NetworkMode""default",
 // 端口映射
 "PortBindings": {
        "3306/tcp": [
            {
                "HostIp""",
                "HostPort""4306"
            }
        ]
    },
    // 重启策略
    "RestartPolicy": {
        "Name""always",
        "MaximumRetryCount": 0
    },
    "AutoRemove"false,
    "VolumeDriver""",
    "VolumesFrom": null,
    "CapAdd": null,
    "CapDrop": null,
    "CgroupnsMode""host",
    "Dns": [],
    "DnsOptions": [],
    "DnsSearch": [],
    "ExtraHosts": null,
    "GroupAdd": null,
    "IpcMode""private",
    "Cgroup""",
    "Links": null,
    "OomScoreAdj": 0,
    "PidMode""",
    "Privileged"true,
    "PublishAllPorts"false,
    "ReadonlyRootfs"false,
    "SecurityOpt": [
        "label=disable"
    ],
    "UTSMode""",
    "UsernsMode""",
    "ShmSize": 67108864,
    "Runtime""runc",
    "ConsoleSize": [
        0,
        0
    ],
    "Isolation""",
    "CpuShares": 0,
    "Memory": 0,
    "NanoCpus": 0,
    "CgroupParent""",
    "BlkioWeight": 0,
    "BlkioWeightDevice": [],
    "BlkioDeviceReadBps": null,
    "BlkioDeviceWriteBps": null,
    "BlkioDeviceReadIOps": null,
    "BlkioDeviceWriteIOps": null,
    "CpuPeriod": 0,
    "CpuQuota": 0,
    "CpuRealtimePeriod": 0,
    "CpuRealtimeRuntime": 0,
    "CpusetCpus""",
    "CpusetMems""",
    "Devices": [],
    "DeviceCgroupRules": null,
    "DeviceRequests": null,
    "KernelMemory": 0,
    "KernelMemoryTCP": 0,
    "MemoryReservation": 0,
    "MemorySwap": 0,
    "MemorySwappiness": null,
    "OomKillDisable"false,
    "PidsLimit": null,
    "Ulimits": null,
    "CpuCount": 0,
    "CpuPercent": 0,
    "IOMaximumIOps": 0,
    "IOMaximumBandwidth": 0,
    "MaskedPaths": null,
    "ReadonlyPaths": null
}

注意:重启docker服务,可能会影响到其他在运行的容器!

systemctl restart docker

修改容器的名称

docker rename mysql5.7.30 mysql5.7.30_New

修改重启策略

如果你创建了某个容器,但是忘记配置随Docker服务重启而重启容器,那么除了像上文一样修改hostconfig配置文件,还可以使用命令。

docker update --restart=always mysql5.7.30

快照

容器生成镜像

使用命令将容器8bb0da591362保存为新的镜像,并添加提交人信息和说明信息。

# 查看容器情况
docker ps -a

# 用容器生成镜像快照
export CONTAINERID=8bb0da591362
export CONTAINERNAME=mysql:5.7.30  
docker commit \
 -a junkuang \
  -m "migration to another" \
  -p \
  $CONTAINERID \
  $CONTAINERNAME-back-`date +%Y%m%d`

# 查看镜像列表
docker images
  • -a junkuang:提交人是君匡
  • -m "my first commit" : 修改提交内容备注
  • -p: 在打包容器为镜像时暂停运行
  • 8bb0da591362: 用容器ID选择指定容器,没有办法用容器名称
  • mysql:5.7.30-back:备份镜像名

镜像保存

将镜像保存到指定目录的tar压缩包文件

# 查看镜像
docker images

# 镜像保存到压缩包
export IMAGEID=ec7c9fe9057f
export IMAGENAME=mysql-5.7.30-back-20220722
docker save \
    -o /home/keen/$IMAGENAME.tar \
    $IMAGEID
  • -o: 指定压缩包文件名和路径
  • IMAGEID:指定镜像ID

之后便可以用工具或者命令复制出来备份文件保存起来了。

#格式:scp 用户名@IP地址:文件所在路径 本地路径

#复制到本地下载目录
scp root@39.96.12.167:/home/keen/mysql-5.7.30-back-20220722.tar /Users/keen/Downloads

镜像恢复

复制备份镜像文件到新的服务器中,使用命令将tar包导成镜像。

# 复制文件
scp  /Users/keen/Downloads/mysql-5.7.30-back-20220722.tar  root@43.138.47.149:/home/keen/mysql-5.7.30-back-20220722.tar

#加载备份镜像,尖括号与文件名间无空格
docker load </home/keen/mysql-5.7.30-back-20220722.tar

#查看景象列表
docker images

#重命名导入的仓库和镜像
docker tag 90c277453e59 mysql:5.7.30-back-20220722

然后用这个镜像创建新的容器即可。

docker run \
    --name mysql5.7.30back \
    -p 4306:3306 \
    -e MYSQL_ROOT_PASSWORD=123456 \
    -d \
    --restart=always \
    --privileged=true \
    -v /home/keen/docker/mysql-5.7/conf/my.cnf:/etc/mysql/my.cnf \
    -v /home/keen/docker/mysql-5.7/data/:/var/lib/mysql \
    mysql:5.7.30-back-20220722

感谢

感谢现在的好奇,为了能成为更好的自己。

  1. 如何修改运行中的docker容器的端口映射
  2. linux 安装docker,离线安装docker

分类:

后端

标签:

后端

作者介绍

君匡
V1