DOCKER学习记录

1.运行准备

$ docker --version #查看版本
$ systemctl  start docker  ##启动docker
$ sudo service docker restart #重启docker
$ docker version #启动后执行可以得到详细版本信息,如果出现Got permission denied,则要修改用户权限 

$ cat /etc/group | grep docker #查看已经存在的用户组
$ sudo groupadd -g 999 docker #如果不存在,创建新的用户组
$ sudo gpasswd -a ${USER} docker #添加当前用户到docker用户组中

$ cd /var/run 
$ ls -al | grep docker #查看docker相关文件的权限
$sudo chmod a+rw /var/run/docker.sock #给docker.sock添加rw权限
$ sudo gedit /etc/docker/daemon.json #编辑daemon.json
#添加以下内容
{
  "registry-mirrors": ["https://registry.docker-cn.com"]
}
$ sudo docker run hello-world #起手式

2. 基本操作

2.1 从仓库获取镜像

$ docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] #从仓库获取镜像
$ docker pull ubuntu:16.04 #从官方仓库拉取,镜像仓库为ubuntu,版本为16.04

2.2 运行

$docker run -it --rm ubuntu:16.04 bash #打开Ubuntu容器的bash
# -it: i代表交互式操作, t代表终端
#--rm: 表示容器退出后将其删除(不需要保留结果,可以节省空间)
# bash: 放在容器后的命令,调用容器的bash
$ cat /etc/os-release #获取ubuntu容器的系统信息
$ exit 或者Ctrl+D可以退出容器

2.3 列出镜像

$ docker image ls #列出现有的镜像,分别列出镜像仓库,版本,ID,创建时间和容量
$ docker system df #展示现有的docker整体占用空间

#仓库名和标签均为<None>的为虚悬镜像(dangling)
$ docker image ls -f dangling=true #显示所有虚悬镜像
$ docker image prune #删除虚悬镜像

$ docker image ls -a #查看中间层镜像,其仓库名和标签都为none,但不能删除
$ docker image ls ubuntu #根据仓库名来列出镜像
$ docker image ls -f since=mongo:3.2 #-f代表filter,since表示列出3.2之后的mongo镜像
$ docker image ls -q #只获取镜像的ID
$ docker image ls --format "{{.ID}}: {{.Repository}}" #自行设置格式
$ docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.Tag}}"

2.4 删除镜像

docker删除的操作,包括untagged和delete,只有一个镜像的所有标签都被untagged.才会触发删除delete,删除该镜像层

$ docker image ls #中已经包含了每一个镜像的ID
$ docker image rm *** #使用短ID的前3位,基本就可以确定哪个镜像
$ docker image rm ***:*** #s使用仓库名+版本号来删除镜像
pss. #删除镜像前需要把该镜像生成的所有容器先删除掉
$ docker container ls #可以看到运行中的容器
$ docker container stop *** #终止正在运行的容器
$ docker container ls -a #可以看到终止的容器
$ docker container rm *** #删除已经终止的容器
$ docker container rm -f *** #删除正在运行的容器
$ docker container prune #删除所有已经终止的镜像
psss. #centos 和rethat因为没UnionFs使用,所以在CENTOS 和 rethat上安装docker时需要特殊配置direct-lvm给devicemapper

2.5 利用commit了解镜像

commit对镜像的操作属于黑箱操作,别人无从得知修改了什么,并且每一次修改都会让镜像变得更加臃肿,因为其是在原有的镜像上覆盖新的存储层.

$ docker pull nginx #docker下载nginx镜像
$ docker run --name webserver -d -p 80:80 nginx #用nginx启动一个容器,命名webserver, 并映射本机的80端口,使用 http://localhost可以访问到nginx服务器
$ docker exec -it webserver bash #使用exec进入容器,并调用bash
$ echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html #在终端中运行,改变index页面,然后会浏览器刷新
$ docker diff webserver #使用diff查看容器的修改
$ docker commit #可以把修改的容易的存储层保存成新的镜像, 
$ docker commit --author "walker" --message "change the default page." webserver nginx:v2 #容器名可以用6位的容器tag代替
$ docker commit -a "walker" -m "change the default page" ****** nginx:v2 #另一种写法
$ docker history nginx:v2 #可以查看镜像的修改历史
$ docker run --name web2 -d -p 81:80 nginx:v2 #使用http://localhost:81可以查看默认页面

2.6 使用dockerfile构建镜像(build)

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

$ mkdir nginxv3
$ cd nginxv3
$ touch Dockerfile #在一个空白目录中新建一个dockerfile

#Dockerfile中写入:
$ FROM nginx
$ RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html
2.6.1 FROM

FROM指定基础镜像,必须是Dockerfile的第一条命令
FROM scratch意味着不指定任何镜像为基础

2.6.2 RUN

RUN相当于在shell中直接运行的命令,但使用太多的RUN会导致镜像变得很臃肿,层数太多,而且DOCKER镜像的最大层数不能超过127层,所以正确的写法为:

FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
	&& apt-get update \
	&& apt-get install -y $buildDeps \
	&& wget -O redis.tar.gz "http://download.redis.io/releases/r
	edis-3.2.5.tar.gz" \
	&& mkdir -p /usr/src/redis \
	&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-component
	s=1 \
	&& make -C /usr/src/redis \
	&& make -C /usr/src/redis install \
	&& rm -rf /var/lib/apt/lists/* \
	&& rm redis.tar.gz \
	&& rm -r /usr/src/redis \
	&& apt-get purge -y --auto-remove $buildDeps

Dockerfile支持用行尾添加\来换行, 行首添加#来注释.
镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要
添加的东西,任何无关的东西都应该清理掉。

docker build -t nginx:v3 . #.表示当前目录,docker build会把该目录下的所有内容交给Docker引擎以帮助构成镜像

将 Dockerfile 置于一个空目录下,或者项目根目录下,并在该目录下打开终端构建docker。如果该目录下没有所需文件,那么应该把所需文件复制一份过来。如果目录下有些东西确实不希望构建时传给 Docker 引擎,那么可以用 .gitignore 一样的语法写一个 .dockerignore ,该文件是用于剔除不需要作为上下文传递给 Docker 引擎的。
Docker采用C/S设计,类似于mysql.Docker的FROM和RUN类似于sql语句,通过一组API和docker引擎交互,以完成各种功能.

$ COPY ./package.json /app/ #复制当前目录下的文
$ docker build -t nginx:v3 -f ***.file . #-f指定***.file为Dockerfile

docker build 还可以有多种方式来进行构建

$ docker build https://github.com/twang2218/gitlab-ce-zh.git#:8.14 #指定docker去git clone这个项目,并进入指定的8.14目录去进行构建
$ docker build https://server/context.tar.gz #docker会下载这个压缩包,解压并进入相应的文件夹后开始构建
$ docker build - < Dockerfile #从标准输入中进行构建
$ cat dockerfile | docker build - #从标准输入中进行构建
$ docker build - < context.tar.gz #自动解压压缩包,并进行构建


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值