--- 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 ``` ```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 ``` docker停止容器 ```shell docker stop ``` docker重启容器 ```shell docker restart ``` ## 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 slaveof # 查看master ip docker inspect # 主库有密码必需要配置,代表主库的访问密码 masterauth ``` 运行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 ``` 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 ``` ## 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 ``` ## 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 ``` ![image-20221121125608385](https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221121125608385.png) 拉取镜像 ```shell docker pull jenkins/jenkins ``` 查看镜像 ```shell docker images ``` ![image-20221121131216876](https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221121131216876.png) 启动镜像 ```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 ``` ![image-20221121131635658](https://markdownhexo.oss-cn-hangzhou.aliyuncs.com/img/image-20221121131635658.png)可以找到初始密码 ## 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 ```