1.Linux安装Docker
sudo wget -qO- https//get.docker.com | sh
sudo:作为普通用户,希望以管理员的身份运行
wget:Linux的下载工具,如果没有下载即可
-q:让wget输出不要太多
O-:让wget标准输出,而不是输出到文件
https//get.docker.com:下载地址
| sh:管道的概念,从上面的网址下载了一个shell脚本,交给sh[shell]去执行
shell会检测你的版本,并按照你的版本来安装
sudo usermod -aG docker root
docker 只允许root执行,将当前用户加入到docker组中
如果系统是CentOS7,则CentOS-Extras 库中已带 Docker,可以直接安装:
yum -y install docker
启动,和其他的service启动都是一样的
systemctl start docker
让docker开机启动
chkconfig docker on
查看docker的相关信息
docker info
2.Docker的架构Architectrue
DOCKER_HOST:进行Docker操作的虚拟机;
Docker daemon:由虚拟机运行的Docker程序,由该程序运行各种各样的Docker操作,如:下载Docker的镜像;运行一个容器;
Client:客户端,我们从客户端给Docker daemon发起命令,进行操作,如:docker build;docker pull;docker run;
Registry:互联网的一个仓库服务,所有Docker用户共享的一个Docker服务,Docker daemon可以从其中获取文件
3.Docker的简单命令及解释
3.1运行Docker镜像
docker run ubuntu echo hello world
通过Docker运行ubuntu image,结束后,输出hello world;
如果本地的没有,会从远端的镜像仓库下载,
查看本地images镜像
docker images
带有参数的docker run
docker run -p 8080:80 -d daocloud.io/nginx
-p : 做端口映射,8080:80,将原本的Docker的80端口,映射到本地的8080端口
-d : 允许程序直接返回,以守护进程的方式运行的,并且会返回CONTAINER ID
查看当前运行的Docker程序,刚才运行了nginx服务后,可以用curl localhost:8080,进行确认
3.2查看Docker容器
docker ps
如果没有任何参数,只会显示当前运行的容器
列出所有的docker容器:docker ps -a
3.3将文件copy进容器的文件夹内
docker cp index.html 3c160b38650f://usr/share/nginx/html
其中3c160b38650f为其CONTAINER ID
3.4停止Docker容器
docker stop 3c160b38650f
docker stop只是将容器停止了,并没有删除。再次执行docker run命令会创建一个新的容器。
Docker在容器内的操作都是没有保存的,
3.5提交当前运行的容器的改动
docker commit -m 'fun' 41835fe93f71 nginx-docker
此命令会产生一个新的容器,可以在docker images中查看,后面的'nginx-docker'是其名字
3.6删除Docker镜像
docker rmi 300f719c1d79
3.7删除Docker容器
docker rm 3c160b38650f 53ab421c10c9
可以使用空格分开,删除多个
4.Dockerfile
4.1编写Dockerfile文档
FROM alpine:latest
MAINTAINER YuSongYuan
CMD echo "hello docker !!!"
alpine : 是为了docker做的一个极小的linux环境,产生的image会非常小
MAINTAINER : 是告诉其他人这个镜像是谁制作的
CMD : 运行一个cmd命令
4.2使用docker build命令构建镜像
docker build -t hello_docker .
-t : 为新建的镜像添加一个标签/名字,标签/名字为hello_docker
. : 这个点,指的是路径,将当前的路径下的所有的文件都给docker engine,让其来产生镜像
运行之后就会在docker images中产生我们的刚刚创建的镜像,并且标签/名字为hello_docker,可以运行刚刚产生的镜像,会执行CMD后面的命令,输出hello docker !!!
ps:在build时,每一个命令[FROM ,COPY ... ]都会产生一个新层,这些层都是只读的,当被运行成为容器后,变为一个整体,容器层,该层是可读可写的
4.3进阶Dockerfile
在新的目录Dockerfile02,编写Dockerfile文档
FROM daocloud.io/nginx
MAINTAINER YuSongYuan
COPY index.html /usr/share/nginx/html
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"]
EXPOSE 80
FROM ubuntu : 给出基础镜像的名字
RUN apt-get update : 使用apt-get更新ubuntu的库
RUN apt-get install -y nginx : 使用apt-get安装nginx,并且不提醒
COPY index.html /var/www/html : 将index.html文件拷贝进该文件夹内
ENTRYPOINT ["/usr/sbin/nginx", "-g", "daemon off;"] : 提供容器的入点,会将三个内容展开,用空格隔开,执行;这个参数的意义是,将nginx在前台执行,而不是作为守护进程来执行
EXPOSE 80 : 暴露一个端口,普通的http监听的端口
ps:apt-get是一个和yum类似的下载安装包的插件,如果没有改插件,build时会报错
这时候使用
docker build -t hello_nginx .
docker run -d -p 80:80 hello_nginx
运行后,index.html已经被拷贝到Dockerfile中的指向的路径,可以直接用curl localhost:80,进行访问,出现的就是index.html中的内容
4.4Dockerfile语法
5.Docker的存储技术Volume
提供独立于容器之外的持久化存储
可以提供容器与容器之间的共享的数据
5.1Volume操作
docker run -d --name nginx -v /usr/share/nginx/html hello_nginx
--name nginx : 给当前容器一个名字 nginx
-v /usr/share/nginx/html : 容器内部的一个地址,用来访问这些网页的一个地址???
docker inspect nginx
inspect nginx : 检查名字为 nginx的容器
其中
"Mounts": [
{
"Name": "79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15",
"Source": "/var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
将宿主Source中的路径,挂载到了Destination中
如果是linux_host,可以直接访问Source中的路径
ll /var/lib/docker/volumes/79a77f478c56cd12e6f2d40b2bfa181162d291120865ea6cf8d83bb160844a15/_data
如果在Mac中,Source的路径,外面还有一层虚拟层,直接访问是无法访问的
可以使用
screen ~/Library/Containers/com.docker.docker/Data/com.docker.docker.amd64-linux/tty
这个本人并未验证
进入容器中
docker exec -it nginx /bin/bash
比如:查看我们添加进入的index.html,首先cd /usr/share/nginx/html/,然后应当使用cat index.html,使用vi或vim都是找到不到命令的
5.2挂载系统路径
docker run -p 80:80 -d -v $PWD/html : /usr/share/nginx/html daocloud.io/nginx
运行daocloud.io/nginx镜像,并将当前目录[$PWD]下的html目录挂载到/usr/share/nginx/html 中
这时,当我们修改html中的index.html时,访问localhost:8080的内容也会随之改变
5.3挂载容器
docker creat -v $PWD/data:/var/mydata --name data_container docker.io/alpine
以alpine为基础镜像,创建一个数据镜像,并将当前目录中的data挂载到/var/mydata中,起名为data_container
docker run -it --volumes-from data_container docker.io/ubuntu /bin/bash
-it : 这里因为docker.io/alpine是一个基础镜像,没有什么服务,所以用 -it : 以交互的方式运行,需要后面加上/bin/bash
--volumes-from : 从另外一个容器中挂载
这里运行后,会直接进入到容器中,输入下面的命令,这个命令也就是上面使用inspecte命令中,看到的其中的一个属性
mount
会在其中看到
/dev/mapper/centos-root on /var/mydata type xfs (rw,relatime,seclabel,attr2,inode64,noquota)
这时候我们可以cd /var/mydata中,并touch ysy.txt, exit退出容器后,流量可以在data文件夹中看到ysy.txt
这时说明,我们的容器挂载是成功的,一个容器可以被多个容器挂载,做到数据一致性
6.Resgitry镜像仓库
6.1术语介绍
6.2命令介绍
6.3Registry练习
从远程仓库中搜索whalesay
docker search whalesay
其中STAR表示获取的星星的数量,OFFICIA是标注是否为官方的
从远程仓库下载whalesay镜像
docker pull docker.io/docker/whalesay
下载完成后,可以用docker images命令看到本地的镜像仓库中,已经存在刚刚下载的镜像,
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.io/docker/whalesay latest 6b362a9f73eb 2 years ago 247 MB
REPOSITORY : 镜像的名字
TAG : 镜像的标签,latest为缺省的标签,当没有设置标签时,这个就是其标签
在本地新建一个镜像,以ysy/whalesay为其名字
docker tag docker.io/docker/whalesay ysy/whalesay
这时用docker images命令可以看到本地仓库中已经多了名字为ysy/whalesay 的镜像
7.docker-compose多容器app
docker-compose是一个独立的,用于通过文本文件拉起多容器app
7.1下载docker-compose
在linux中下载docker-compose
curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-$(uname -s)-$(uname -m) > /usr/local/bin/docker-compose
其中,-$(uname -s)-$(uname -m)是获取当前的这两个命令的输出,拼接到地址中,> 是指通过管道技术,下载到后面的目录中,成为可执行文件
[root@localhost ~]# uname -s
Linux
[root@localhost ~]# uname -m
x86_64
7.2docker-compose实战
7.2.1实战项目架构介绍
7.2.2实战项目yaml配置文件
7.2.3项目实战
在ghost中创建三个文件夹
mkdir ghost nginx data
在ghost文件夹中创建Dockerfile文件
FROM ghost
COPY ./config.js /var/lib/ghost/config.js
EXPOSE 2368
CMD ["npm", "start", "--production"]
ghost : 从官方拉取
["npm", "start", "--production"] : 这个是node.js的程序,使用npm命令启动
在ghost文件夹中创建config.js文件
var path = require('path'),
config;
config = {
production:{
url: 'http://mytestblog.com',
mail: {},
database: {
client: 'mysql',
connection: {
host: 'db',
user: 'ghost',
password: 'ghost',
database: 'ghost',
port: '3306',
charst: 'utf8'
},
debug: false
},
paths: {
contentPath: path.join(process.env.GHOST_CONTENT, '/')
},
server: {
host: '0.0.0.0',
prot: '2368'
}
}
};
在nginx中添加Dockerfile配置文件
FROM nginx
COPY nginx.conf /etc/nginx/nginx.conf
EXPOSE 80
因为在ghost中已经有启动命令,所以这里就不在有启动命令
在nginx文件夹中添加nginx.conf文件
worker processes 4;
events {worker connections 1024;}
http {
server {
listen 80;
lacation / {
proxy pass http://ghost-app:2368;
}
}
}
这里是使用ghost-app这个名字指向ghost
在最外层的ghost文件夹内创建docker-compose.yml文件
version: '2'
networks:
ghost:
service:
ghost-app:
build: ghost
network:
- ghost
depends_on:
- db
ports:
- "2368:2368"
nginx:
build: nginx
networks:
- ghost
depends_on:
- ghost-app
ports:
- "80:80"
db:
image: "mysql:5.7.15"
networks:
- ghost
environment:
MYSQL_ROOT_PASSWORD: mysqlroot
MYSQL_USER: ghost
MYSQL_PASSWORD: ghost
volumes:
- $PWD/data:/var/lib/mysql
ports:
- “3306”
volumes : 将数据库的路径挂载到容器中,这样写的博客就会被存下来,不会随着容器的消失而消失
将docker-compose拉起来
docker-compose up -d
这时候访问 localhost:80,产生502错误,说明nginx已经起来的,但是nginx和ghost之间链接有错误
将nginx.conf的变量名中的空格替换为下划线
将docker-compose停掉
docker-compose stop
将停掉的容器删除
docker-compose rm
再次将docker-compose拉起来的时候,需要使用build命令
docker-compose build
因为第一次将docker-compose拉起来的时候,docker-compose会自动帮我们build镜像,但是第二次就不会了
然后再次使用 docker-compose up -d 命令将docker-compose拉起来
访问locallhost:80就可以正常的看到nginx的欢迎页面
这时访问localhost/ghost路径,就可以自动的跳转到localhost/ghost/setup的路径下面
这时表示我们的三个容器协作运行已经是没问题的了
本人的docker-compose没有下载完成,暂未测试