docker基础学习

mac2024-05-26  31

本文转自:https://www.cnblogs.com/crazymagic/articles/10128964.html,修改并补充了一些内容

Docker 安装、架构、docker实例、dockerfile

docker linux 安装配置

linux安装

1

sudo wget -qO- https://get.docker.com | sh 

安装成功

 遇到以下问题

 

 

执行

1

sudo apt-get -f install

 docker安装成功后默认只允许root用户运行,所以我们要把普通的用户添加docker用户组中 

1

sudo usermod -aG docker python

更新用户组  

1

newgrp docker

检测docker 信息  

1

docker info

  

 

 

配置国内镜像加速

在/etc/docker/daemon.json 中写入如下内容(如果文件不存在请新建该文件)

1

2

3

4

{

  "registry-mirrors": ["https://registry.docker-cn.com"]

}

重新启动服务

1

2

3

sudo systemctl daemon-reload

 

sudo systemctl restart docker

    

docker架构介绍

 

 

查看当前有哪些镜像

1

docker images

运行当前镜像中的 ubuntu 输入 hello world

1

docker run ubuntu echo hello world

输出结果如下

docker 实战第一步:nginx部署

运行nginx镜像

docker run --name nginx/test -d -p 8080:80 nginx --name 容器名称 -p 做端口映射, -d 允许这个程序直接返回,把这个容器作为守护进程执行 nginx:镜像,本地没有的话会远程下载

1

docker run --name nginx/test -d -p 8080:80 nginx

本地没有的话会远程下载

输入自己ip地址

1

http://192.168.228.135:8080/

  

 

这条命令会以Nginx为镜像创建并启动一个容器,映射了80端口,这样我们可以在浏览器中访问这个Nginx服务器!假设,我们现在不喜欢这个欢迎页面的样式,

想把它改为“Hello Docker!”

创建index.html

1

2

3

4

5

<html>

 

<h1>hello docker</h1>

 

</html>  

 copy文件到docker容器,运行以下命令

docker cp 文件名 容器ID://usr/share/nginx/html

1

docker cp index.html d94ddbd2ee54://usr/share/nginx/html/ 

 刷新浏览器

查看当前运行的容器

1

docker ps

  

停止当前运行的nginx

1

2

3

docker container stop a930e6cfafdd

或者

docker stop a930e6cfafdd

再次查看 当前运行的容器

1

docker ps  

 

再次启动nginx

1

docker run -p 8080:80 -d nginx

我们发现再次启动nginx镜像后不是原来我们改动的页面,这是因为docker在内部的改动都是暂时的,没有被保存下来

要想保存下来则需要在修改完之后要用docker commit -m "(注释)" id (image名称)用于保存docker容器的修改

此时会产生一个新的image或者容器

1

docker cp index.html 21567621f574://usr/share/nginx/html/ 

提交:docker commit -m 'fun' 容器ID 镜像名称

1

docker commit -m 'fun' 21567621f574  nginx-fun1

  

这时候会创建一个新的容器 

1

docker images

下次可以使用这个新的容器运行,返回的是我们修改后的页面

1

docker run -p 8080:80 -d nginx-fun1

 

列出所有的容器运行的记录  

1

docker ps -a

 挨个删除历史记录

 

 常用命令

 dockerfile

通过编写简单的文件自创docker镜像

第一个dockerfile 案例

创建Dockerfiler 文件 写入以下内容 ,apliner 专门针对docker做的极小的linux 环境。 MAINTAINER 维护人员的名字  CMD 命令 

1

2

3

FROM alpine:latest

MAINTAINER zhangbiao

CMD echo 'hello docker'

使用docker build命令进行构建 构建容器  

 -t : 标签的名字

1

docker build -t hello_docker .

 

查看所有镜像

 

运行这个容器

1

docker run hell0_docker

输出结果如下

 

 

创建 dockerfiles目录

在dockerfiles目录下创建 Dockerfile 

1

2

3

4

5

6

7

8

FROM ubuntu

MAINTAINER zhangbiao

RUN sed -i 's/archive.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list

RUN apt-get update

RUN apt-get install -y nginx

COPY index.html /var/www/html

ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]

EXPOSE 80

在dockerfiles目录下创建index.html

1

今天是周日

 

 使用docker build命令进行构建 构建容器 

1

docker build -t zb/hello-niginx .

docker build 用来构建 -t 表示给它一个标签, . 表示通过当前目录下的所有文件来进行构建。

查看所有的容器   

  

 要没安装nginx的话要先安装

1

apt-get install -y nginx

停止nginx  

1

sudo nginx -s stop

运行新创建的容器

1

docker run -d -p 80:80 zb/hello-niginx 

访问80

1

curl http://localhost

 

dockflie语法

cmd 是表示在运行容器时执行的指令,有两种格式

#shell 格式

cmd <命令>

eg:cmd echo $HOME

#exec 格式

cmd ["可执行文件",“参数1”,“参数2”]

eg: cmd ["sh","-c","echo $HOME"]

ENTRYPOINT 容器入口 跟CMD有点像,但是权重比较CMD高,当两者同时出现时,CMD后面的是ENTRYPONT的args即 参数

add和copy的区别:

add是更高级的复制。copy 有的功能它都用,它还能访问网络资源,源路径可以是一个URL。源路径文件也可以是一个压缩文件,可以直接解压。 所以如果想要直接复制一个压缩包进去的话,就要使用COPY 而不能只用ADD了。 官方建议是能使用COPY 的就使用COPY ,因为COPY 命令语义比较明确就是复制文件,并且ADD 指令会使得镜像构建缓存失效,使得镜像构建比较缓慢

 

 

镜像分层

dockerfile中每一行都产生一个新层,镜像里面的层是只读的,一旦镜像启动为容器,就会产生一个可读可写的容器层。

 分层的好处:假如有很多 container 或者 很多的 Image的话,这些层可以共享。那么存储压力会小很多。运行起来方便。

存储 Volume(数据卷)

Volume 提供独立于容器之外的持久化存储,应用场景比如数据库,可以存储在容器外面的分卷上。容器跟容器之间的数据共享也可以用。

第一种:挂起一个数据卷

运行一个nginx容器 ,-v 挂起一个卷,nginx用来访问网页的地址 , -d 以守护进程来运行,--name 给一个名字

1

docker run -d --name nginx -v /usr/share/nginx/html/ nginx

 -v 挂起一个卷,后面跟的是容器中的目录路径即目标路径,目的是将容器中次路径下的数据共享到容器外的物理卷即Source目录,以供其他容器或者服务使用

检查容器的运行状态

1

docker inspect nginx

  

以下可以看到把宿主机的Source 地址,挂载到了容器Destination地址

查看宿主机Source 中的文件,需要进入超级管理员

1

2

3

4

5

su root

 

cd /var/lib/docker/volumes/c964bf96a762050a1414d42ca5da49f12596ff05929b0ce28d940f3efda06ee3/_data

 

ls

对index.html文件做一些改动

1

echo "it's 2019" > index.html

进入nginx容器中查看,有没有被修改  

1

2

3

4

5

6

7

docker exec -it nginx /bin/bash

 

cd /usr/share/nginx/html/

 

ls

 

cat index.html

输出结果如下

第二种:通过本地目录挂载到容器里面的数据卷中去

把当前运行的的容器关掉

当前目录下的 html文件夹

html/index.html

1

2

3

4

5

<html>

 

<h1>hello docker</h1>

 

</html>

 把当前目录下的 html文件夹挂载到nginx容器里面的数据卷中去:

docker run -p 容器外端口:容器内端口 -d -v 容器外路径:容器内路径 镜像

$PWD变量指代的就是当前路径,“:”为映射符,/usr/share/nginx/html 为容器中的路径

1

docker run -p 80:80 -d -v $PWD/html:/usr/share/nginx/html nginx

访问结果如下 

修改index.html中的内容

1

2

3

4

5

<html>

 

1+1=2

 

</html>  

  

刷新网页后,发现页修改了

第三种:创建一个仅仅提供数据的容器,把这个容器当做volume挂载到其它容器里面去

1

2

3

4

5

6

7

8

mkdir vol3

 

cd vol3/

 

mkdir data

 

# -v 表示的是volume(数据卷)  --name 名字 ubuntu 是这个容器的基础镜像  docker create 创建一个新的容器但不启动它

docker create -v $PWD/data:/var/mydata --name data_container ubuntu

运行一个新的容器,把上面提供数据的容器当做数据卷挂载到当前的容器中运行,-it表示交互的方式运行,会直接进入到这个容器中

1

docker run -it --volumes-from data_container ubuntu /bin/bash

创建一个文件 

1

2

3

4

5

cd /var/mydata/

 

touch whatever.txt

# 退出

ctrl +d

 

查看vol3/data 目录我们可以看到这里面多了一个whatever.txt的文件,说明了 data_container 这个容器被当做了数据卷,被多个容器共享 

1

2

3

cd data

 

ls

 

Registry

 

 搜索镜像

1

docker search whalesay

按照starts 从大到小排序

拉取镜像

1

docker pull docker/whalesay

查看下载的镜像  

1

docker images

运行该镜像

1

docker run docker/whalesay cowsay 你好啊

镜像的重命名

docker tag 原镜像名  重命名后的镜像名             

例如把一个存在的镜像用自己的用户名,产生一个新的镜像,1273844671是自己的pid

1

docker tag docker/whalesay 1273844671/whalesay

  

把自己的镜像共享到dockerhub上去

1

docker push 1273844671/whalesay/

上传成功后,登陆dockerhub官网

1

https://hub.docker.com/u/1273844671

查看个人信息中就要自己上传的镜像

  

compose  

安装 Docker Compose

compose windows和Mac自带

linux 需要自己安装

1

sudo curl -L https://github.com/docker/compose/releases/download/1.9.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

修改权限变为可执行的文件

1

sudo chmod a+x /usr/local/bin/docker-compose

检查版本

1

docker-compose --version

 

快速入门:使用docker-compose打包启动容器

打包项目,获得 jar 包 docker-demo-0.0.1-SNAPSHOT.jar mvn clean package 在 jar 包所在路径创建 Dockerfile 文件,添加以下内容 FROM java:8 VOLUME /tmp ADD docker-demo-0.0.1-SNAPSHOT.jar app.jar RUN bash -c 'touch /app.jar' EXPOSE 9000 ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","app.jar"] 在 jar 包所在路径创建文件 docker-compose.yml,添加以下内容 version: '2' # 表示该 Docker-Compose 文件使用的是 Version 2 file services: docker-demo: # 指定服务名称 build: . # 指定 Dockerfile 所在路径 ports: # 指定端口映射 - "9000:8761" 在 docker-compose.yml 所在路径下执行该命令 Compose 就会自动构建镜像并使用镜像启动容器 docker-compose up docker-compose up -d // 后台启动并运行容器 访问 http://localhost:9000/hello 即可访问微服务接口

工程、服务、容器

Docker Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)、容器(container)Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个工程,一个工程包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例

Docker Compose 常用命令与配置

常见命令

ps:列出所有运行容器 docker-compose ps logs:查看服务日志输出 docker-compose logs port:打印绑定的对外端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口 docker-compose port eureka 8761 build:构建或者重新构建服务 docker-compose build start:启动指定服务已存在的容器 docker-compose start eureka stop:停止已运行的服务的容器 docker-compose stop eureka rm:删除指定服务的容器 docker-compose rm eureka up:构建、启动容器 docker-compose up kill:通过发送 SIGKILL 信号来停止指定服务的容器 docker-compose kill eureka pull:下载服务镜像scale:设置指定服务运行的容器个数,以 service=num 形式指定 docker-compose scale user=3 movie=3 run:在一个服务上执行一个命令 docker-compose run web bash

docker-compose.yml 属性

version:指定 docker-compose.yml 文件的写法格式services:多个容器集合build:配置构建时,Compose 会利用它自动构建镜像,该值可以是一个路径,也可以是一个对象,用于指定 Dockerfile 参数 build: ./dir --------------- build: context: ./dir dockerfile: Dockerfile args: buildno: 1 command:覆盖容器启动后默认执行的命令 command: bundle exec thin -p 3000 ---------------------------------- command: [bundle,exec,thin,-p,3000] dns:配置 dns 服务器,可以是一个值或列表 dns: 8.8.8.8 ------------ dns: - 8.8.8.8 - 9.9.9.9 dns_search:配置 DNS 搜索域,可以是一个值或列表 dns_search: example.com ------------------------ dns_search: - dc1.example.com - dc2.example.com environment:环境变量配置,可以用数组或字典两种方式 environment: RACK_ENV: development SHOW: 'ture' ------------------------- environment: - RACK_ENV=development - SHOW=ture env_file:从文件中获取环境变量,可以指定一个文件路径或路径列表,其优先级低于 environment 指定的环境变量 env_file: .env --------------- env_file: - ./common.env expose:暴露端口,只将端口暴露给连接的服务,而不暴露给主机 expose: - "3000" - "8000" image:指定服务所使用的镜像 image: java network_mode:设置网络模式 network_mode: "bridge" network_mode: "host" network_mode: "none" network_mode: "service:[service name]" network_mode: "container:[container name/id]" ports:对外暴露的端口定义,和 expose 对应 ports: # 暴露端口信息 - "宿主机端口:容器暴露端口" - "8763:8763" - "8763:8763" links:将指定容器连接到当前连接,可以设置别名,避免ip方式导致的容器重启动态改变的无法连接情况 links: # 指定服务名称:别名 - docker-compose-eureka-server:compose-eureka volumes:卷挂载路径 volumes: - /lib - /var logs:日志输出信息 --no-color 单色输出,不显示其他颜. -f, --follow 跟踪日志输出,就是可以实时查看日志 -t, --timestamps 显示时间戳 --tail 从日志的结尾显示,--tail=200

Docker Compose 其它

更新容器

当服务的配置发生更改时,可使用 docker-compose up 命令更新配置此时,Compose 会删除旧容器并创建新容器,新容器会以不同的 IP 地址加入网络,名称保持不变,任何指向旧容起的连接都会被关闭,重新找到新容器并连接上去

links

服务之间可以使用服务名称相互访问,links 允许定义一个别名,从而使用该别名访问其它服务 version: '2' services: web: build: . links: - "db:database" db: image: postgres 这样 Web 服务就可以使用 db 或 database 作为 hostname 访问 db 服务了

 

docker compose实例2

使用Docker Compose 安装ghost Ghost 基于 JavasSript 的 Node.js 进行开发的一个开源的博客系统。

基本架构如下:

 

                                        

创建一个目录

ghost_compose 目录:mkdir ghost_compose && cd ghost_compose,多容器运行的主目录nginx 目录:mkdir nginx,用来创建nginx容器,对应docker-compose.yml中的nginx服务data 目录:不是用来创建mysql容器的,而是用来挂载mysql的存储 - 注意:mysql容器和ghost容器通过docker-compose.yml的镜像直接创建

创建 nginx容器

进入到 nginx 目录创建Dockerfile文件,内容如下:

1

2

3

FROM nginx COPY nginx.conf /etc/nginx/nginx.conf EXPOSE 80

创建 nginx.conf 文件,内容如下:

1

2

3

4

5

6

7

8

9

10

11

12

worker_processes    4; events  {     worker_connections  1024; } http    {     server  {     listen  80;     location    /   {         proxy_pass  http://ghost-app:2368     } } }

 

返回到ghost_compose目录

创建 docker-compose.yml 文件,内容如下:

1

 

version: '2.0'

networks:     ghost:

services:     ghost-app:         image: ghost         restart: always         networks:             - ghost         depends_on:             - db         ports:             - 2368:2368         environment:             database__client: mysql             database__connection__host: db             database__connection__user: root             database__connection__password: example             database__connection__database: ghost

    nginx:         build: nginx         networks:             - ghost         depends_on:             - ghost-app         ports:             - "80:80"

    db:         image: mysql:5.7.15         restart: always         networks:             - ghost         environment:             MYSQL_ROOT_PASSWORD: example             MYSQL_USER: root         volumes:             - $PWD/data:/var/lib/mysql         ports:             - "3306:3306"  

 

 

返回到ghost_compose目录,执行 docker-compose up -d

打开浏览器:访问localhost:80,输出如下:

 

使用Docker安装FastDFS

 

1. 获取镜像

可以利用已有的FastDFS Docker镜像来运行FastDFS。

获取镜像可以通过下载

1

docker image pull delron/fastdfs

2. 运行tracker

执行如下命令开启tracker 服务  

1

docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker

我们将fastDFS tracker运行目录映射到本机的 /var/fdfs/tracker目录中。 

执行如下命令查看tracker是否运行起来  

1

docker container ls

如果想停止tracker服务,可以执行如下命令

1

docker container stop tracker

停止后,重新运行tracker,可以执行如下命令

1

docker container start tracker

3. 运行storage

执行如下命令开启storage服务

1

docker run -dti --network=host --name storage -e TRACKER_SERVER=10.211.55.5:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage

* TRACKER_SERVER=本机的ip地址:22122 本机ip地址不要使用127.0.0.1 

* 我们将fastDFS storage运行目录映射到本机的/var/fdfs/storage目录中 

执行如下命令查看storage是否运行起来  

1

docker container ls

如果想停止storage服务,可以执行如下命令

1

docker container stop storage

停止后,重新运行storage,可以执行如下命令

1

docker container start storage

4.此时两个服务都以启动,进行服务的配置。  

进入storage容器,到storage的配置文件中配置http访问的端口,配置文件在/etc/fdfs目录下的storage.conf  

默认端口是8888,也可以不进行更改

5.配置nginx,在/usr/local/nginx目录下,修改nginx.conf文件 

默认配置如下:

 

也可以更改为如下所示:

1

2

3

location /group1/M00 {

        alias  /var/fdfs;

    }

6.此时文件系统以搭建完毕,使用web模块进行文件的上传,将文件上传至FastDFS文件系统,此处不详细解释,可以问度娘,Python中有相应的扩展包,可直接使用。此处我往文件系统的目录中放置一张照片进去,然后通过url地址进行访问。  

此处展示了FastDFS文件系统的存储结构,在服务器中storage目录下的data中创建了这么多的文件夹进行文件的存储。

将一张照片(cumt.png)放置在/var/fdfs/storage目录下,进入storage容器,进入/var/fdfs目录,运行下面命令:

1

/usr/bin/fdfs_upload_file /etc/fdfs/client.conf cumt.png

此时将该图片已上传至文件系统,并在执行该语句后返回图片存储的uri:  

通过url访问http://ip:8888/group1/M00/00/00/wKgBcFvTv86AOwckAAFbd_uukFc519.png,即可查看到图片(图片为透明背景,所以如此显示)。  

最新回复(0)