340 lines
10 KiB
Markdown
340 lines
10 KiB
Markdown
---
|
||
title: Docker
|
||
date: 2021-03-23 10:30:31
|
||
author: 文永达
|
||
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/67239FBB-E15D-4F4F-8EE8-0F1C9F3C4E7C.jpeg
|
||
---
|
||
# Docker
|
||
|
||
---
|
||
|
||
Docker:海豚,身上背着一堆集装箱
|
||
|
||
场景:
|
||
|
||
传统的服务器 Docker
|
||
1G左右 几十兆几百兆
|
||
CentOS占CPU Docker CPU引擎占用低
|
||
1-2分钟 几秒
|
||
安装软件 安装方便
|
||
部署应用 部署应用,挂载,数据卷
|
||
多个应用放到一起 每个应用服务都是一个容器,相互隔离
|
||
一个独立的操作系统 必须依赖于操作系统,推荐使用Linux
|
||
|
||
## docker安装:
|
||
|
||
```shell
|
||
curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun
|
||
# 另一种方式
|
||
curl -sSL https://get.daocloud.io/docker | sh
|
||
# 如上述两种方式都不行
|
||
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
|
||
# 查看所有可安装版本
|
||
yum list docker-ce --showduplicates | sort -r
|
||
# 安装
|
||
yum install docker-ce-18.03.1.ce
|
||
|
||
```
|
||
|
||
1、镜像:image。一个镜像代表一个软件。如:redis镜像,mysql镜像,tomcat镜像。。
|
||
特点:只读
|
||
2、容器:container。一个镜像只要一启动,称之为启动了一个容器。
|
||
3、仓库:repository。存储docker中的镜像具体位置
|
||
远程仓库:在全球范围内有一个远程仓库
|
||
本地仓库:当前自己机器中下载的镜像存储位置
|
||
|
||
Docker配置阿里云镜像加速
|
||
https://www.cnblogs.com/LUA123/p/11401962.html
|
||
|
||
## 查看docker 信息
|
||
|
||
```shell
|
||
docker info
|
||
```
|
||
|
||
## 查看docker 镜像 image
|
||
|
||
```shell
|
||
docker images
|
||
```
|
||
|
||
## docker 安装镜像 image
|
||
|
||
MySQL 5.7
|
||
|
||
```shell
|
||
docker pull mysql:5.7
|
||
```
|
||
|
||
## docker 移除镜像 image
|
||
|
||
若已有镜像用于容器,请先将容器删除
|
||
|
||
```shell
|
||
docker rm -f <CONTAINER ID>
|
||
```
|
||
|
||
```shell
|
||
docker image rm hello-world
|
||
docker rmi hello-world
|
||
```
|
||
|
||
```shell
|
||
# 第一个8080是外部海豚上的 第二个8080是内部集装箱上的
|
||
docker run -p 8080:8080
|
||
```
|
||
|
||
-a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项;
|
||
-d: 后台运行容器,并返回容器 ID;
|
||
-i: 以交互模式运行容器,通常与 -t 同时使用;
|
||
-P: 随机端口映射,容器内部端口随机映射到主机的端口
|
||
-p: 指定端口映射,格式为:主机 (宿主) 端口:容器端口
|
||
-t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用;
|
||
--name="nginx-lb": 为容器指定一个名称;
|
||
--dns 8.8.8.8: 指定容器使用的 DNS 服务器,默认和宿主一致;
|
||
--dns-search example.com: 指定容器 DNS 搜索域名,默认和宿主一致;
|
||
-h "mars": 指定容器的 hostname;
|
||
-e username="ritchie": 设置环境变量;
|
||
--env-file=[]: 从指定文件读入环境变量;
|
||
--cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定 CPU 运行;
|
||
-m : 设置容器使用内存最大值;
|
||
--net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型;
|
||
--link=[]: 添加链接到另一个容器;
|
||
--expose=[]: 开放一个端口或一组端口;
|
||
--volume , -v 绑定一个卷
|
||
|
||
docker启动容器
|
||
|
||
```shell
|
||
docker start <container id>
|
||
```
|
||
|
||
docker停止容器
|
||
|
||
```shell
|
||
docker stop <container id>
|
||
```
|
||
|
||
docker重启容器
|
||
|
||
```shell
|
||
docker restart <container id>
|
||
```
|
||
|
||
## docker启动MariaDB
|
||
|
||
拉去mariadb镜像
|
||
|
||
```shell
|
||
docker pull mariadb:10.2
|
||
```
|
||
|
||
```shell
|
||
docker images
|
||
docker run --name mariadb10.2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -d mariadb:10.2
|
||
```
|
||
|
||
## dockerRedis主从复制集群搭建
|
||
|
||
拉取redis4.0.11镜像
|
||
|
||
```shell
|
||
docker pull redis:4.0.11
|
||
```
|
||
|
||
编辑redis.conf
|
||
|
||
redis-master.conf
|
||
|
||
```shell
|
||
vim /root/mysoftware/docker-file/redis/redis-master.conf
|
||
bind 0.0.0.0 #让redis可以被任意ip访问
|
||
daemonize yes #让redis服务后台运行
|
||
# 如需设定密码
|
||
requirepass masterpassword # 设定密码
|
||
```
|
||
|
||
redis-slave1.conf
|
||
|
||
```shell
|
||
vim /root/mysoftware/docker-file/redis/redis-slave1
|
||
bind 0.0.0.0 #让redis可以被任意ip访问
|
||
daemonize yes #让redis服务后台运行
|
||
# 如需设定密码
|
||
requirepass masterpassword # 设定密码
|
||
# 设置主机地址端口 redis5.0以上为 replicaof <master-IP> <master-port>
|
||
slaveof <master-IP> <master-port>
|
||
# 查看master ip
|
||
docker inspect <container id>
|
||
# 主库有密码必需要配置,<master-password>代表主库的访问密码
|
||
masterauth <master-password>
|
||
```
|
||
|
||
运行redis容器
|
||
|
||
redis-master
|
||
|
||
```shell
|
||
# 运行服务
|
||
docker run -it --name redis-master -v /usr/docker/redis/redis-master.conf:/usr/etc/redis/redis.conf -v /usr/docker/redis/data/:/data -d -p 35379:6379 redis:4.0.11 /bin/bash
|
||
# 进入容器
|
||
docker exec -it redis-master bash
|
||
# 加载配置
|
||
redis-server /usr/local/etc/redis/redis.conf
|
||
# 如报错
|
||
mkdir -p /usr/redis/bin
|
||
# 测试连接
|
||
redis-cli -a <master-password>
|
||
```
|
||
|
||
redis-slave1
|
||
|
||
```shell
|
||
# 运行服务
|
||
docker run -it --name redis-slave1 -v /usr/docker/redis/redis-slave1.conf:/usr/etc/redis/redis.conf -v /usr/docker/redis/data/:/data -d -p 35380:6379 redis:4.0.11 /bin/bash
|
||
# 进入容器
|
||
docker exec -it redis-slave1 bash
|
||
# 加载配置
|
||
redis-server /usr/local/etc/redis/redis.conf
|
||
# 如报错 Can't chdir to '/usr/redis/bin': No such file or directory
|
||
mkdir -p /usr/redis/bin
|
||
# 测试连接
|
||
redis-cli
|
||
# 查看主从信息
|
||
info Replication
|
||
# 密码认证
|
||
auth <slave-password>
|
||
```
|
||
|
||
## dockerRedis哨兵高可用集群搭建
|
||
|
||
## docker的镜像迁移到另一台服务器
|
||
|
||
```shell
|
||
# 找到想要移动的docker容器ID
|
||
dockerCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
|
||
58ac9237b040 redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6380->6379/tcp redis-slave1
|
||
454bb484f90a redis:4.0.11 "docker-entrypoint.s…" 5 hours ago Up 2 hours 0.0.0.0:6379->6379/tcp redis-master
|
||
ps -a
|
||
|
||
# 提交变更,并且把容器保存成镜像,命名为redis-master
|
||
docker commit 454bb484f90a redis-master
|
||
# 把redis-master镜像保存成tar文件
|
||
docker save redis-master > /root/mysoftware/docker-file/redis/redis-master.tar
|
||
# 拷贝到新的机器,执行load命令
|
||
docker load < ./redis-master.tar
|
||
```
|
||
|
||
## 修改运行中的docker容器的端口映射和挂载目录
|
||
|
||
方法一:删除原有容器,重建新容器
|
||
|
||
参考以上移除容器,启动容器
|
||
|
||
方法二:修改配置文件,重启docker服务
|
||
|
||
容器配置文件路径:
|
||
|
||
/var/lib/docker/containers/[[hash_of_the_container]/hostconfig.json]
|
||
|
||
其中的hashofthecontainer是docker镜像的hash值,可以通过docker ps或者docker inspect containername查看。(CONTAINER ID就可以看出来)
|
||
|
||
可以到/var/lib/docker/containers目录下,ls -l
|
||
|
||
```json
|
||
{"Binds":["/usr/docker/redis/redis-slave2.conf:/usr/local/etc/redis/redis.conf"],"ContainerIDFile":"","LogConfig":{"Type":"json-file","Config":{}},"NetworkMode":"default","PortBindings":{"6379/tcp":[{"HostIp":"","HostPort":"6381"}]},"RestartPolicy":{"Name":"no","MaximumRetryCount":0},"AutoRemove":false,"VolumeDriver":"","VolumesFrom":null,"CapAdd":null,"CapDrop":null,"Dns":[],"DnsOptions":[],"DnsSearch":[],"ExtraHosts":null,"GroupAdd":null,"IpcMode":"shareable","Cgroup":"","Links":null,"OomScoreAdj":0,"PidMode":"","Privileged":false,"PublishAllPorts":false,"ReadonlyRootfs":false,"SecurityOpt":null,"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,"DiskQuota":0,"KernelMemory":0,"MemoryReservation":0,"MemorySwap":0,"MemorySwappiness":null,"OomKillDisable":false,"PidsLimit":0,"Ulimits":null,"CpuCount":0,"CpuPercent":0,"IOMaximumIOps":0,"IOMaximumBandwidth":0}
|
||
```
|
||
|
||
重启docker服务,再启动容器服务就可以了。
|
||
|
||
```shell
|
||
systemctl restart docker
|
||
docker ps -a
|
||
docker start <container id>
|
||
```
|
||
|
||
## docker安装code-server
|
||
|
||
```shell
|
||
# 拉取镜像
|
||
docker pull codercom/code-server
|
||
# 创建宿主机目录
|
||
mkdir /usr/docker/codeserver
|
||
# 创建配置文件
|
||
vim /usr/docker/codeserver/config.yaml
|
||
|
||
bind-addr: 127.0.0.1:8080
|
||
auth: password
|
||
password: 123456
|
||
cert: false
|
||
|
||
# 创建并启动容器 # -u 表示以 root用户运行
|
||
docker run -d -u root -p 8088:8080 --name code-server -v /usr/docker/codeserver/config.yaml:/root/.config/code-server/config.yaml -v /usr/docker/codeserver:/home/code codercom/code-server
|
||
```
|
||
|
||
## docker安装Jenkins
|
||
|
||
搜索Jenkins镜像
|
||
|
||
```shell
|
||
docker search jenkins
|
||
```
|
||
|
||

|
||
|
||
拉取镜像
|
||
|
||
```shell
|
||
docker pull jenkins/jenkins
|
||
```
|
||
|
||
查看镜像
|
||
|
||
```shell
|
||
docker images
|
||
```
|
||
|
||

|
||
|
||
启动镜像
|
||
|
||
```shell
|
||
cd /usr/local
|
||
mkdir jenkins_home
|
||
docker run -d -uroot -p 8889:8080 -p 50000:50000 --name jenkins -v /usr/bin/docker:/usr/bin/docker -v /var/run/docker.sock:/var/run/docker.sock -v /etc/sysconfig/docker:/etc/sysconfig/docker -v /usr/local/jenkins_home:/var/jenkins_home -v /etc/localtime:/etc/localtime jenkins/jenkins
|
||
```
|
||
|
||
启动后查看日志
|
||
|
||
```shell
|
||
docker logs jenkins
|
||
```
|
||
|
||
可以找到初始密码
|
||
|
||
|
||
|
||
## docker安装Nginx
|
||
|
||
```shell
|
||
docker pull nginx
|
||
docker run -d -p 80:80 -p 443:443 --name nginxweb --privileged=true
|
||
-v /usr/local/nginx/html/:/usr/share/nginx/html
|
||
-v /usr/local/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
|
||
-v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d
|
||
-v /usr/local/nginx/logs:/var/log/nginx nginx
|
||
|
||
|
||
ps aux | grep "nginx: worker process" | awk '{print $1}'
|
||
```
|
||
|
||
## docker安装SQL Server
|
||
|
||
```shell
|
||
mkdir /etc/sqlserver_data
|
||
chmod -R 777 /etc/sqlserver_data
|
||
docker pull mcr.microsoft.com/mssql/server
|
||
docker run -e "ACCEPT_EULA=Y" -e "MSSQL_SA_PASSWORD=Wyd210213" -p 1433:1433 --memory 2000M --name sqlserver2022 -v /etc/sqlserver_data:/var/opt/mssql -d mcr.microsoft.com/mssql/server
|
||
```
|
||
|