本文转自:https://www.cnblogs.com/crazymagic/articles/10128964.html,修改并补充了一些内容
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
查看当前有哪些镜像
1
docker images
运行当前镜像中的 ubuntu 输入 hello world
1
docker run ubuntu echo hello world
输出结果如下
运行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
挨个删除历史记录
常用命令
通过编写简单的文件自创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 提供独立于容器之外的持久化存储,应用场景比如数据库,可以存储在容器外面的分卷上。容器跟容器之间的数据共享也可以用。
第一种:挂起一个数据卷
运行一个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
搜索镜像
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 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 安装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,输出如下:
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,即可查看到图片(图片为透明背景,所以如此显示)。