Centos8安装Docker
Docker容器操作
查看容器:
$ sudo docker ps -a
打开容器:
sudo docker statr “CONTAINER ID”
$ sudo docker start cc32bf495919 //举例:打开portainerUI
操作容器:
$ sudo docker exec -it “container-name” bash // 进入容器操作界面
退出容器:
- 直接exit退出容器,会关闭当前容器;
- 通过按Ctrl+P+Q进行退出容器,此时不会关闭当前容器。
宿主机与容器间数据互传:
宿主机传给容器:
$ sudo docker cp /home/gysg/developer/catalina.sh tomcat:/usr/local/tomcat/bin/
容器传给宿主机:
$ sudo docker cp tomcat:/usr/local/tomcat/bin/catalina.sh /home/gysg/developer/
文件权限不一致造成运行问题,因此需要把权限取消或者还原
$ sudo chmod 777 -R dirs // 设置为777,任何人都可以操作
$ sudo chmod 644 -R dirs // 设置为root权限
容器运行说明:
$ docker run [OPTIONS] IMAGE [COMMAND] [ARG…]
1
2
3
4
5
6
7
8
9
10
11
12
13-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
-d: 后台运行容器,并返回容器ID;
-i: 以交互模式运行容器,通常与 -t 同时使用;
-P: 随机端口映射,容器内部端口随机映射到主机的高端口
-p: 指定端口映射,格式为:主机(宿主)端口:容器端口
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
--name="nginx-lb": 为容器指定一个名称;自动重启设置:
在运行docker容器时可以加如下参数来保证每次docker服务重启后容器也自动重启:
$ sudo docker run –restart=always
如果已经启动了则可以使用如下命令:
$ sudo docker update –restart=always
CentOS 8中安装Docker
官方参考地址:https://docs.docker.com/install/linux/docker-ce/centos/
里面包含包下载地址: https://download.docker.com/linux/centos/7/x86_64/stable/Packages/
安装依赖
$ sudo yum install -y yum-utils device-mapper-persistent-data lvm2
$ sudo yum-config-manager –add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo yum install docker-ce docker-ce-cli containerd.io
如果报错:Problem: package docker-ce-3:19.03.4-3.el7.x86_64 requires containerd.io >= 1.2.2-3 那就先装新版的 containerd.io
$ sudo dnf install https://download.docker.com/linux/centos/7/x86_64/stable/Packages/containerd.io-1.2.6-3.3.el7.x86_64.rpm
再装剩下两个
$ sudo yum install docker-ce docker-ce-cli
$ sudo systemctl start docker
$ docker –version
开机自启
$ sudo systemctl enable docker
CentOS 8中安装Docker出现和Podman冲突
查看是否安装 Podman
rpm -q podman
删除Podman
dnf remove podman
安装 Docker
dnf install docker-ce docker-ce-cli
Docker下安装图形化工具
docker 图形页面管理工具常用的有三种,DockerUI ,Portainer ,Shipyard 。DockerUI 是 Portainer 的前身,这三个工具通过docker api来获取管理的资源信息。平时我们常常对着shell对着这些命令行客户端,审美会很疲劳,如果有漂亮的图形化界面可以直观查看docker资源信息,也是非常方便的。今天我们就搭建单机版的三种常用图形页面管理工具。这三种图形化管理工具以Portainer最为受欢迎。
安装轻量级图形页面管理之Portainer:
查看portainer镜像
$ docker search portainer
选择喜欢的portainer风格镜像,下载
$ docker pull portainer/portainer
启动dockerui容器
$ docker run –restart=always -d –name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
浏览器访问 http://192.168.2.119:9000 , 设置一个密码即可,点击创建用户
Docker下安装MySQL8
安装MySQL源
$ sudo docker pull mysql:8.0.20 // 指定版本号安装MySQL
第一次启动
$ sudo docker run -p 3306:3306 –name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20
配置持久化数据
根目录创建目录:
$ mkdir /workdir
目录迁移:
$ cp /var/lib/mysql /workdir/
配置信息修改:
打开/etc/mysql目录下的my.cnf配置文件,修改其中的 ”datadir = /workdir/mysql“,再重新存入原位置
$ sudo /home/***/my.cnf mysql:/etc/mysql
重启容器MySQL
修改加密规则
$ docker exec -it mysql bash // 进入MySQLcontainer
$ mysql -uroot -p123456 // 登录MySQL
$ alter user ‘root‘@’%’ identified by ‘123456’ password expire never;
$ alter user ‘root‘@’%’ identified with mysql_native_password by ‘123456’;
$ create user ‘xxh‘@’%’ identified with mysql_native_password by ‘xxh123!@#’;
$ GRANT ALL PRIVILEGES ON . TO ‘xxh‘@’%’;
$ flush privileges; // 使设置立即生效
镜像拉取问题
默认会拉取最新版本的镜像,然而却总是卡在某段动也不能动……
解决方案先修改宿主机下的 /etc/docker/的daemon.json文件,此处网上有多种修改方案我也试过几种…最后用的是下面这个:
1
2
3{
"registry-mirrors": ["https://9cpn8tt6.mirror.aliyuncs.com"]
}dockerfile配置
1
2
3
4
5
6
7container_name: 'local_db'
build: ./services/mysql
environment: MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
ports:
- "3306:3306"
volumes:
- ${MYSQL_DATA_PATH}:/var/lib/mysql数据持久化(不推荐)
1
2
3
41. 需要在修改mysql容器中的根目录下,新建目录 mdkir /workdir 。
2. 将 /var/lib/mysql 复制 到新建目录中。
3. 修改 /etc/mysql/my.cnf
datadir = /workdir/mysql
Docker下安装Tomcat
安装Tomcat
$ sudo docker pull tomcat:latest
设置Tomcat时区一致
在tomcat/bin下的catalina.sh最后加上下面这一句即可:
JAVA_OPTS=”${JAVA_OPTS} -Duser.timezone=GMT+08”
启动Tomcat
$ sudo docker run -p 8090:8080 –name tomcat -d tomcat:latest
或者如下:
$ sudo docker run –name tomcat -d -p 8090:8080 -v /home/gysg/developer/websoft:/usr/local/tomcat/webapps -v /mnt/data:/mnt/data tomcat-gysg:2.0
给运行中Docker容器安装SSH服务
这里我以我本地一个运行中的SQL Server的数据库服务为例
1、打开命令面板,输入指令docker ps查看运行中的容器并复制容器ID
2、输入指令docker exec -it <复制的容器ID> /bin/sh,进入命令行工具
3、进入命令行工具后首先建议输入指令apt-get update更新下源
4、输入指令apt-get install openssh-server,安装SSH服务
5、安装完毕后,输入指令service ssh satrt 启动SSH服务
6、使用vim进入/etc/ssh/sshd.config文件更改SSH服务配置,将PermitRootLogin的值从withoutPassword改为yes,允许root用户进行登录
7、输入指令passwd root设置root用户登录密码
8、如果docker容器中没有安装vim,则输入指令apt-get install vim进行安装
9、输入指令service ssh restart重启SSH服务
10、输入exit退出当前容器命令行工具
11、回到系统命令面板,输入指令docker ps查看当前运行中的容器并复制安装好SSH服务的容器ID
12、为了避免后期因为各种原因重复安装SSH服务,建议输入指令docker commit <复制的容器ID> <自己定义的镜像名>,保存经想到本地
13、停止当前镜像,输入指令docker run -e 'ACCEPT_EULA=Y' -e 'SA_PASSWORD=567rty%^&YUI' -p 1433:1433 -p 8400:20 -d microsoft/mssql-server-linux:latest,启动刚才保存在本地的镜像并把SSH服务的20端口映射出来,这里我映射的是主机8400duankou
14、为了方便,这里还可以输入指令docker update --restart=always <容器ID>让容器保持始终运行。
Docker下DNS解析出错的处理
Temporary failure in name resolution(域名解析暂时失败)
我的操作环境为CentOS 8,与CentOS 7使用命令完全一致。其他不同Linux系统版本命令可能会有所不同,请根据自己的系统版本使用对应命令,直接百度相关操作即可。
检查主机网络设置
查看系统是否打开ip地址转发功能:
$ cat /proc/sys/net/ipv4/ip_forward // 返回0则说明未打开,开启ip地址转发
使用命令打开配置文件:
$ vi /etc/sysctl.conf
打开内核配置文件,查找net.ipv4.ip_forward = 0,将其修改为net.ipv4.ip_forward = 1,若该行开头有#,将其去掉;若配置文件中没有此项,则在文件最后添加此内容。
保存修改后,重启系统或输入以下命令使修改生效:
$ sysctl -p /etc/sysctl.conf
$ systemctl restart network检查一下问题是否解决,若没有则进入下一步排查。
检查主机防火墙配置
查看防火墙状态(若防火墙为关闭状态,可跳过防火墙有关设置):
$ sudo firewall-cmd –state
若返回
runging
,则防火墙为开启状态,查看防火墙是否开启ip地址转发(ip地址伪装):$ sudo firewall-cmd –query-masquerade
若返回
no
,则输入以下命令开启ip地址转发:$ sudo firewall-cmd –add-masquerade –permanent
然后输入以下命令使修改生效:
$ sudo firewall-cmd –reload
再次检查问题是否已经解决,若没有则进行再一步排查。
设置Docker指定DNS服务器
打开Docker相关设置文件(宿主机内),没有就新建一个,输入下列命令会打开或自动新建:
$ vi /etc/docker/daemon.json
在文件中输入以下内容:
{ "dns": ["8.8.8.8","114.114.114.114"] }
8.8.8.8和114.114.114.114是两个DNS服务器,可以修改或增加。
然后重启Docker:
$ systemctl restart docker
到这里问题应该就可以得到解决了。
修改容器配置文件,重启docker服务
容器的配置文件路径
/var/lib/docker/containers/[hash_of_the_container]/hostconfig.json`
其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来)
按需修改端口, 按需修改挂载目录(权限和属主属组要相同),然后重启docker服务
格式:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70{
"Binds":
["/srv/gitlab/logs:/var/log/gitlab",
"/srv/gitlab/data:/var/opt/gitlab",
"/srv/gitlab/config:/etc/gitlab"],
"ContainerIDFile":"",
"LogConfig":
{"Type":"journald","Config":{}},
"NetworkMode":"default",
"PortBindings":
{"22/tcp":[{"HostIp":"","HostPort":"10022"}],
"443/tcp":[{"HostIp":"","HostPort":"10443"}],
"80/tcp":[{"HostIp":"","HostPort":"10080"}]},
"RestartPolicy":
{"Name":"always","MaximumRetryCount":0},
"AutoRemove":false,
"VolumeDriver":"",
"VolumesFrom":null,
"CapAdd":null,
"CapDrop":null,
"Dns":[],
"DnsOptions":[],
"DnsSearch":[],
"ExtraHosts":null,
"GroupAdd":null,
"IpcMode":"",
"Cgroup":"",
"Links":[],
"OomScoreAdj":0,
"PidMode":"",
"Privileged":false,
"PublishAllPorts":false,
"ReadonlyRootfs":false,
"SecurityOpt":null,
"UTSMode":"",
"UsernsMode":"",
"ShmSize":67108864,
"Runtime":"docker-runc",
"ConsoleSize":[0,0],
"Isolation":"",
"CpuShares":0,
"Memory":0,
"NanoCpus":0,
"CgroupParent":"",
"BlkioWeight":0,
"BlkioWeightDevice":null,
"BlkioDeviceReadBps":null,
"BlkioDeviceWriteBps":null,
"BlkioDeviceReadIOps":null,
"BlkioDeviceWriteIOps":null,
"CpuPeriod":0,
"CpuQuota":0,
"CpuRealtimePeriod":0,
"CpuRealtimeRuntime":0,
"CpusetCpus":"",
"CpusetMems":"",
"Devices":[],
"DiskQuota":0,
"KernelMemory":0,
"MemoryReservation":0,
"MemorySwap":0,
"MemorySwappiness":-1,
"OomKillDisable":false,
"PidsLimit":0,
"Ulimits":null,
"CpuCount":0,
"CpuPercent":0,
"IOMaximumIOps":0,
"IOMaximumBandwidth":0
}Tomcat配置
[“/home/gysg/developer/websoft:/usr/local/tomcat/webapps”, “/mnt/data:/mnt/data”]
sudo docker run --name tomcat-new-01 -d -p 8090:8080 -v /home/gysg/developer/websoft:/usr/local/tomcat/webapps -v /mnt/data:/mnt/data tomcat-new-01:latest
Docker的备份与还原
备份容器
$ docker ps // 查看已创建的容器
$ docker commit -p “CONTAINER ID” container-name // 提交生成镜像快照
镜像打包
提交镜像到docker hub
如果我们想要在Docker注册中心上传或备份镜像,我们只需要运行 docker login 命令来登录进Docker注册中心,然后推送所需的镜像即可。
代码如下:
$ docker login // username: password:
$ docker tag “IMAGE ID” “filepath/image-name:tag” // 打标记
$ docker push “filepath/image-name” // 提交
保存镜像到本地文件
$ docker save -o ~/container-backup.tar container-backup // 备份路径.tar 要备份的镜像名称
恢复备份
远程恢复
$ docker pull “filepath/image-name:tag”
本地恢复
$ docker load -i ~/container-backup.tar // 备份路径.tar
加载新容器
docker run …
重启docker
$ sudo systemctl restart docker
Docker报错日常docker: Error response from daemon:
解决方法:
- 停止所有的容器,有时候也不需要全部停止
1 | docker stop $(docker ps -q) |
- 强制移除此容器
1 | docker rm -f mysql1 |
- 清理此容器的网络占用
格式:docker network disconnect --force 网络模式 容器名称
示例:docker network disconnect --force bridge mysql1
- 简查是否还有同名容器占用
格式:docker network inspect 网络模式
示例:docker network inspect bridge
- 重新构建容器
1 | docker run --name mysql1 -d -p3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:latest |
Tomcat启动运行缓慢处理
直接改jdk的配置
打开jdk安装路径 $JAVA_PATH/jre/lib/security/java.security 这个文件,找到下面的内容:
securerandom.source=file:/dev/random
替换成:
securerandom.source=file:/dev/./urandom
或者在启动时加上如下参数:
$ -e JAVA_OPTS=”-Duser.timezone=Asia/Shanghai -Djava.security.egd=file:/dev/./urandom”
或者修改catlina.sh,在第一行加入以下代码:
1
2
3
4> if [[ "$JAVA_OPTS" != *-Djava.security.egd=* ]]; then
> JAVA_OPTS="$JAVA_OPTS -Djava.security.egd="
> fi
>
Docker镜像无法删除的问题
$ sudo docker image ls
$ sudo docker rm -f tomcat:latest
Docker下执行构建命令
$ sudo docker build -t image-name:tag .
Docker下创建kms服务器
启动KMS服务器:
$ sudo docker run -idt -p 1688:1688 –name kms-server vlmcsd
启动Tomcat服务器:
$ sudo docker run –name tomcat -dit -p 8090:8080 -v /etc/localtime:/etc/localtime:ro -v /home/gysg/developer/websoft:/usr/local/soft/tomcat/webapps -v /mnt/data:/mnt/data tomcat-gysg:2.0
$ sudo docker run –name tomcat -dit -p 8080:8080 -v /etc/localtime:/etc/localtime:ro -v /home/pi/developer/websoft:/usr/local/soft/tomcat/webapps -v /mnt/data:/mnt/data -v /mnt/usb/movie:/mnt/usb/movie tomcat-gysg:9.1.arm
启动MySQL数据库:
$ sudo docker run -p 3306:3306 –name mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:8.0.20
启动图形化管理界面:
$ docker run –restart=always -d –name portainerUI -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock portainer/portainer
Nginx启动:
1
2
3
4
5
6
7
8
9
10
11> docker run --detach \
> --name nginx \
> -p 443:443\
> -p 80:80 \
> -v /nginx/data:/usr/share/nginx/html:rw\
> -v /nginx/config/nginx.conf:/etc/nginx/nginx.conf/:rw\
> -v /nginx/config/conf.d/default.conf:/etc/nginx/conf.d/default.conf:rw\
> -v /nginx/logs:/var/log/nginx/:rw\
> -v /nginx/ssl:/ssl/:rw\
> -d nginx
>Jenkins启动:
创建一个jenkins目录
$ mkdir /home/jenkins_home;
启动一个jenkins容器
$ sudo docker run -d –name jenkins -p 9100:8080 -p 50000:50000 -v /home/gysg/developer/jenkins:/var/jenkins_home -v /home/gysg/developer/android-sdk:/var/android-sdk jenkins/jenkins:lts