侧边栏壁纸
博主头像
春潮带雨晚来急博主等级

行动起来,活在当下

  • 累计撰写 32 篇文章
  • 累计创建 1 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

docker

Administrator
2023-12-09 / 0 评论 / 0 点赞 / 47 阅读 / 19140 字

- 0.完全清华镜像

```

如果你之前安装过 docker,请先删掉:

sudo yum remove docker docker-common docker-selinux docker-engine

安装一些依赖:

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

下载适配centos系统的源:

wget -O /etc/yum.repos.d/docker-ce.repo https://download.docker.com/linux/centos/docker-ce.repo

把软件仓库地址替换为 TUNA(清华大学):

sudo sed -i 's+download.docker.com+mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo

最后安装:

sudo yum makecache fast

sudo yum install -y docker-ce

```

- 1.卸载老版本

```

1.

sudo yum remove docker \

docker-client \

docker-client-latest \

docker-common \

docker-latest \

docker-latest-logrotate \

docker-logrotate \

docker-selinux \

docker-engine-selinux \

docker-engine

2.

a. yum list installed | grep docker输出:docker-ce.x86_64 ……docker-ce-cli.x86_64

b. 删除安装的软件包

yum -y remove docker-ce.x86_64yum -y remove docker-ce-cli.x86_64

c. 删除镜像/容器等

rm -rf /var/lib/docker/

d/ 输入docker或docker –version验证是否卸载

docker --version打印出:-bash: /usr/bin/docker: No such file or directory

```

- 2.安装

```

sudo yum install -y yum-utils \

device-mapper-persistent-data \

lvm2

```

- 2.5 用阿里的镜像

```

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

```

- 3.添加repo

```

sudo yum-config-manager \

--add-repo \

https://download.docker.com/linux/centos/docker-ce.repo

```

- 3.5可选安装:(Optional: Enable the edge and test repositories)

```

$ sudo yum-config-manager --enable docker-ce-edge

---

$ sudo yum-config-manager --enable docker-ce-test

```

- 3.8更新yum缓存

```

sudo yum makecache fast

```

- 4.INSTALL DOCKER CE

```

sudo yum install docker-ce

---安装完成!

```

- 5.Start Docker

```

sudo systemctl start docker

```

- 5.5更换镜像

```

vim /etc/docker/daemon.json

{

"registry-mirrors": ["http://ef017c13.m.daocloud.io"],

"live-restore": true

}

或者

{

"registry-mirrors": ["https://3zfwxe4j.mirror.aliyuncs.com"]

}

systemctl daemon-reload

```

- 6.CentOS安装Docker-Machine(MAC不用,Win另类安装)

```

$ curl -L https://github.com/docker/machine/releases/download/v0.15.0/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&

chmod +x /tmp/docker-machine &&

sudo cp /tmp/docker-machine /usr/local/bin/docker-machine

or

base=https://github.com/docker/machine/releases/download/v0.14.0 &&

curl -L $base/docker-machine-$(uname -s)-$(uname -m) >/tmp/docker-machine &&

sudo install /tmp/docker-machine /usr/local/bin/docker-machine

```

- 6.5docker-compose

```

sudo curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

```

- 7.用到的命令

- docker image ls // 列出docker里面的镜像

- docker pull redis/mysql // 下载docker的实例

- docker run hello-world // 运行一个docker实例

- docker container ls ( -a) == docker ps -a // 列举出来当前的容器(所有的容器(包括容器的信息),包括正在运行的和已经退出的)

- docker rm dcf3d8f7a529 (删除上一步查询出来的容器Id)

- docker container ls -aq (查询出所有容器的id,只有id)

- docker rm $(docker container ls -aq) 批量删除 所有的容器

- docker run -it centos // 交替运行Centos

- docker commit CONTAINER_NAMES CONTAINER_ID/Centos-vim // 将某个docker(container的名称)创建成一个image镜像(container的id/新名称)

- docker history IMAGE_ID // 查看这个镜像Image的演进过程

- docker image rm IMAGE_ID 删除某个镜像

- docker rename oldContainerName newContainerName //修改容器的名称

- Dockerfile

- 新建一个文件夹,vim一个文件名为:Dockerfile

- 编辑内容为

```

FROM centos // 表示基础环境

RUN yum install -y vim // 表示打包安装一个东西进去

```

- docker build -t songxiankun2008/centos-vim-new .

// 执行打包生成image的命令 后面的`.`表示执行当前目录下的Dockefile里面的命令

- [x] 接下来就会根据Dockerfile里面的命令进行分步骤执行,在安装的过程中会临时生成一个Docker的Container的ID;在安装完成的时候会删除这个临时Container的ID,再生成一个全新可用的ID

- FROM (//为了安全尽量使用官方的image作为制作的image)

- FROM scratch # 制作base image

- FROM centos # 使用base image

- FROM ubantu:14.04

- LABEL (作者等描述信息)

- LABEL maintainer = "songxiankun2018@gmail.com"

- LABEL version = "1.0"

- LABEL description = "This is description"

- Metadata 不可少 ! (类似注释)

###### RUN

-

```

RUN yum update && yum install -y vim \ python-dev # 反斜线换行

```

-

```

RUN apt-get update && apt-get install -y perl \ pwgen --no-install-recommends && rm -rf \

var/lib/apt/lists/*

```

-

```

RUN /bin/base -C 'source $HOME/.bashrc;echo $HOME'

```

<code>RUN</code>为了美观,复杂的RUN请用==反斜线换行==!避免无用分层,合并多条命令成一行!

###### WORKDIR (设定当前目录)

```

WORKDIR /root

```

```

WORKDIR /test #如果没有会自动创建test目录

WORKDIR demo

RUN pwd #输出结果应该是 /test/demo

```

- 用 ++WORKDIR++,不要用<code>RUN cd</code>!

- 尽量使用绝对目录

###### ADD and COPY

- 这两个的意思是将文件放到Docker容器中去;

add与copy的区别是,add可以在添加的过程中执行一些动作;

- 大部分情况<code>copy</code>优于<code>add</code>,add除了copy还有额外的功能(解压),添加远程文件/目录请使用curl或者wget!

eg:

```

ADD hello /

```

```

ADD test.tar.gz / #添加到根目录并解压

```

```

WORKDIR /root

ADD hello test/ #即路径为: /root/test/hello

```

```

WORKDIR /root

COPY hello test/

```

###### ENV

```

ENV MYSQL_VERSION 5.6 #设置常量

RUN apt-get install -y mysql-server= "{MYSQL_VERSION" && rm -rf /var/lib/apt/lists/* #引用常量

```

- 尽量使用ENV增加可维护性!

###### VOLIME and EXPOSE

(存储和网络)

###### CMD and ENTRYPOINT

- CMD:

- 容器启动时默认执行的命令

- 如果docker run指定了其他命令,CMD命令被忽略

- 如果定义了多个CMD,只有最后一个会执行

eg:

```

FROM centos

ENV name Docker

CMD echo "hello $name"

```

那么build这个DockerFile,并运行这个容器的话会输出“hello Docker”

docker run [image] 会输出 hello Docker 【满足上面第一点条件】

Docker run -it [image] /bin/bash 输出的话,则不会输出...【满足上面第二点条件,指定了/bin/bash命令,则就不会执行前面的命令,所以就不会输出该输出的那段话】

- ENTRYPOINT:

- 让容器以应用程序或者服务的形式运行

- 不会被忽略,一定会执行

- 最佳实践:写一个shell脚本作为entryPoint

```

COPY docker-entrypoint.sh /usr/local/bin/

ENTRYPOINT ["docker-entrtpoint.sh"]

EXPOSE 27017

CMD ["mongod"]

```

- 其中<code>EXPOSE 27017</code>是将端口

---

- 交互式的进入一个已经运行的容器中去执行命令:

<code>docker exec -t containerId /bin/bash</code>

- 查看container详细的信息:

<code>docker inspect containerId</code>

- 查看Docker运行过程中的一些输出,或者是日志

<code>Docker logs ContainerId</code>

###### stress [压力测试]

先在系统中安装stress,eg:ubantu:<code>apt-get update && apt-get install -y stress</code>

1. stress -vm 1 [打印出普通日志]

2. stress -vm 1 --verbose [打印出debug的日志,较多]

- 启动容器的时候就调试日志

docker run -it war3sxkcs/ubantu-stress --vm 1 --verbose

其中<code>--vm 1 --verbose</code>相当于类似在<code>cmd</code>中运行的

#### Docker Network

单机:

- Bridge Network

- Host Network

- None Network

多机:

- Overlay Network

##### 数据持久化之Data Volume

Volume字段可以将Docker里面的数据输出到linux本地eg:

VOLUME /var/lib/mysql

建议启动方式:

docker run -v mysql:/var/lib/mysql

##### 数据持久化之==bind Mounting== (++可实时的同步源文件++)

<code>bind Mounting</code>与<code>Data Volume</code>的区别在于:

- Data Volume需要在docker容器里面进行定义

- bind Mounting不需要在容器里面定义。只需要在docker容器启动的时候,在启动命令中指定linux实际路径与docker里面的路径即可.eg:<code>docker run -v /home/aaa:/root/aaa</code>

Dockerfile再次实战:

- <code>Dockerfile</code>

```

# this same shows how we can extend/change an existing official image from Docker Hub

FROM nginx:latest

# highly recommend you always pin versions for anything beyond dev/learn

WORKDIR /usr/share/nginx/html

# change working directory to root of nginx webhost

# using WORKDIR is prefered to using 'RUN cd /some/path'

COPY index.html index.html

# I don't have to specify EXPOSE or CMD because they're in my FROM

```

- <code>index.html</code>

```

<!doctype html>

<html lang="en">

<head>

<meta charset="utf-8">

<title>hello</title>

</head>

<body>

<h1>Hello Docker! </h1>

</body>

</html>

```

---

- 编译<code> docker build -t war3sxkcs/docker-nginx .</code>

- 启动<code> docker run -d -p 80:80 --name web war3sxkcs/docker-nginx</code>

(-d 是表示后台运行,-p是表示指定端口与外界的端口映射。--name web ,是给该启动的容器取一个别名叫做web)

- 启动起来过后,因为容器里面的80端口是映射到容器内部的80端口的,所以直接在linux本地访问80端口,就能够访问到刚刚的<code>index.html</code>

- linux访问当前80端口:<code>curl 127.0.0.1</code>,即可查看当前页面.

- 现在删除掉这个容器即(docker rm -f web)。用“-v”参数来启动这个容器,是表示linux本地的一个文件与docker容器中的一个文件进行同步。

- 所以新的启动命令就是<code>docker run -d -v $(pwd):/usr/share/nginx/html -p 80:80 --name web war3sxkcs/dockernginx</code>,这个启动命令只是比之前的那个启动命令多了个“-v”参数. $(pwd)是指当前环境致成变量传入,当前的路径就是index.html所在的这个路径

- 然后再交互式运行到docker里面去查看docker里面的index.html的变化。即<code>docker exec -it web /bin/bash </code>

- 此时无论在linux中修改index.html还是在docker中修改这个index.html文件,这两个文件都是同步的。并且修改了保存后可以直接访问,没有需要再去重启什么的

###### 6-1 wordpress

- 启动 mysql

```

docker run -d --name mysql -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=wordpress mysql

```

- -d:后台启动

- -v:映射到本地路径

- -e:环境变量的设置

- -p:端口映射

- <code>MYSQL_ROOT_PASSWORD</code>这个和<code>MYSQL_DATABASE</code>是来源于Docker的hub上的关于mysql的文档专门写的有,账号和密码都是root

关于在容器中调用mysql的其他demo:

```

docker run --name some-wordpress --link some-mysql:mysql -d wordpress

```

- 启动 wordpress

```

docker run -d -e WORDPRESS_DB_HOST=mysql:3306 --link mysql -p 8080:80 wordpress

```

###### 6-3 docker-compose

- <code></code>

- <code>docker-compose up</code>:启动一个compose。前提是在当前文件夹下面有一个<code>docker-compose.yml</code>文件,否则的话就只能指定这个文件<code>docker-compose /home/docker-compose.yml up</code>。这一套命令是适用于debug模式,会输出一些日志的

- 常规默认启动情况下是用后台启动的方式启动:<code>docker-compose up -d</code>

- <code>docker-compose ps </code>是查看当前的环境中有几个service存在

- <code>docker-compose start</code>开始所有被停止的compose

- <code>docker-compose stop</code>停止所有活跃的compose

- <code>docker-compose down</code>停止当前运行的compose,并将其容器一并删除,同时也会删除bridge网桥连接,并不会删除image

- <code>docker-compose images</code>查看compose定义的image

- exec [用法与docker container 类似]

- docker-compose exec [serviceName] bash

- eg: <code>docker-compose exec mysql base</code>

- 此处的mysql即serviceName来自于docker-compose.yml中的service的名称

- <code>docker network ls </code>查看compose的网络状况[网桥链接之类的]

###### 6-4 水平扩展和负载均衡

将docker里面的某个service复制多份,达到负载均衡和高可用的效果。

即: <code>docker-compose --scale serviceName = 3 -d </code>意思是将当前docker-compose.yml里面的[serviceName]复制成三份,(如果docker-compose.yml里面的端口号没有删除的话,这个命令是要报错的。所以在执行这个命令的时候需要将docker-compose.yml里面的port端口号删除。但是执行这个命令之前,需要先将这个docker-compose不删除端口的启动起来)

![image](https://sxk.s3.didiyunapi.com/pic/docker/docker.png)

这三个一样的service的端口号都是同一个端口,比如port:5000。上图中,HAproxy会访问中间那一块用5000端口,那么中间那一块的N个会自动权衡哪个web去处理,又返回到后面的redis。[HAProxy是一个负载均衡器]

在中间的那N个,每次处理的时候都不是同一个在处理,而是以此循环轮训的来调用其中的一个来处理

network如果没有指定的话,那一般就是<code>bridge</code>网络

###### 6-5 一个复杂的投票应用

```

services:

voting-app:

build: ./voting-app/.

volumes:

- ./voting-app:/app

ports:

- "5000:80"

links:

- redis

networks:

- front-tier

- back-tier

result-app:

build: ./result-app/.

volumes:

- ./result-app:/app

ports:

- "5001:80"

links:

- db

networks:

- front-tier

- back-tier

worker:

build: ./worker

links:

- db

- redis

networks:

- back-tier

redis:

image: redis

ports: ["6379"]

networks:

- back-tier

db:

image: postgres:9.4

volumes:

- "db-data:/var/lib/postgresql/data"

networks:

- back-tier

volumes:

db-data:

networks:

front-tier:

back-tier:

```

<code>docker-compose up = docker-compose up && docker-compose run</code>

###### 7. Dokcer编排工具swarm

++7.2 - 7.3++

0

评论区