Docker的一些详细使用方法

简介

docker是一种linux容器技术。容器有效的将由单个操作系统挂管理的资源划分到孤立的组中,以便更好的在组之间平衡有冲突的资源使用需求 。每个容器内运行一个应用,不同的容器之间相互隔离,容器之间也可以建立通信机制。容器的创建和停止都十分快速,资源需求远远低于虚拟机。

镜像:类似虚拟机镜像
容器:类似linux系统环境,运行和隔离应用。容器从镜像启动的时候,docker会在镜像的最上一层创建一个可写层,镜像本身是只读的,保持不变。
仓库:每个仓库存放某一类镜像。

常用命令

镜像相关

搜索镜像

docker search <image> # 在docker index中搜索image

下载镜像

docker pull <image> # 从docker registry server 中下拉image

还可通过指定标签下载某镜像

docker pull [:TAG]
docker pull centos:7

列出镜像列表/删除

docker images
docker images -a # 列出所有的images(包含历史)
docker ps -a #列出本机所有容器
docker rmi <image ID>: # 删除一个或多个image

各个选项说明:
REPOSITORY:表示镜像的仓库源
TAG:镜像的标签
IMAGE ID:镜像ID
CREATED:镜像创建时间
SIZE:镜像大小

存出和载入镜像:

存出本地镜像文件为.tar

docker save -o ubuntu_14.04.tar ubuntu:14.04

导入镜像到本地镜像库

docker load --input ubuntu_14.04.tar
docker load < ubuntu_14.04.tar

上传镜像
用户在dockerhub网站注册后,即可上传自制的镜像。

docker push NAME[:TAG]
docker push abc_name/ubuntu:vim  
====
docker tag testimage:lastest zmc/testimage:lastest
docker push zmc/testimage:lastest

创建镜像
当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。
1、从已经创建的容器中更新镜像,并且提交这个镜像
更新镜像之前,我们需要使用镜像来创建一个容器。

runoob@runoob:~$ docker run -t -i ubuntu:15.10 /bin/bash   #创建并进入容器

在运行的容器内使用 apt-get update 命令进行更新。
在完成操作之后,输入 exit 命令来退出这个容器。

root@e218edb10161:/# apt-get

此时 ID 为 e218edb10161 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

runoob@runoob:~$ docker commit -m="has update" -a="runoob" e218edb10161 runoob/ubuntu:v2
sha256:70bf1840fd7c0d2d8ef0a42a817eb29f854c1af8f7c59fc03ac7bdee9545aff8

各个参数说明:
-m: 提交的描述信息
-a: 指定镜像作者
e218edb10161:容器 ID
runoob/ubuntu:v2: 指定要创建的目标镜像名和标签
-p,–pause=true 提交是暂停容器运行

使用我们的新镜像 runoob/ubuntu 来启动一个容器

runoob@runoob:~$ docker run -t -i runoob/ubuntu:v2 /bin/bash                            
root@1a9fbdeb5da3:/#

2、使用 Dockerfile 指令来创建一个新的镜像

我们使用命令 docker build , 从零开始来创建一个新的镜像。为此,我们需要创建一个 Dockerfile 文件,其中包含一组指令来告诉 Docker 如何构建我们的镜像。

runoob@runoob:~$ cat Dockerfile 
FROM    centos:6.7
MAINTAINER      Fisher "fisher@sudops.com"

RUN     /bin/echo 'root:123456' |chpasswd
RUN     useradd runoob
RUN     /bin/echo 'runoob:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D

每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
第一条FROM,指定使用哪个镜像源
RUN 指令告诉docker 在镜像内执行命令,安装了什么。。。
然后,我们使用 Dockerfile 文件,通过 docker build 命令来构建一个镜像。

参数说明:
-t :指定要创建的目标镜像名
. :Dockerfile 文件所在目录,可以指定Dockerfile 的绝对路径

runoob@runoob:~$ docker build -t runoob/centos:6.7 .      #最后一个点是Dockerfile 文件所在目录
Sending build context to Docker daemon 17.92 kB
Step 1 : FROM centos:6.7
 ---&gt; d95b5ca17cc3
Step 2 : MAINTAINER Fisher "fisher@sudops.com"
 ---&gt; Using cache
 ---&gt; 0c92299c6f03
Step 3 : RUN /bin/echo 'root:123456' |chpasswd
 ---&gt; Using cache
 ---&gt; 0397ce2fbd0a
.......

设置镜像标签

runoob@runoob:~$ docker tag 860c279d2fec runoob/centos:dev

容器相关

容器是镜像的一个运行实例,不同的是它带有额外的可写层。
可认为docker容器就是独立运行的一个或一组应用,以及它们所运行的必需环境。

使用镜像启动一个容器

docker run -it ubuntu /bin/bash

参数说明:
-i: 交互式操作。
-t: 终端。
ubuntu: ubuntu 镜像。
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。可以不带这个参数

查看所有容器
docker ps -a
开启容器b750bbbcfd88  为容器id
docker start b750bbbcfd88 
停止容器
docker stopb750bbbcfd88 
后台运行容器 添加-d参数
$ docker run -itd --name ubuntu-test ubuntu /bin/bash
重启容器
docker restart <容器 ID>
进入容器
docker exec -it 243c32535da7 /bin/bash
删除容器
docker rm <container...> #:删除一个或多个container
docker rm -f 1e560fca3906
docker rm `docker ps -a -q` #:删除所有的container
docker ps -a -q | xargs docker rm #:同上, 删除所有的container
修改容器
docker commit <container> [repo:tag] # 将一个container固化为一个新的image,后面的repo:tag可选。

导入导出容器

$ docker export 1e560fca3906 > ubuntu.tar
$ cat docker/ubuntu.tar | docker import - test/ubuntu:v1

启动容器指定不同端口

 docker run -d -p 5000:5000 training/webapp python app.py
 我们可以指定容器绑定的网络地址,比如绑定 127.0.0.1。
 docker run -d -p 127.0.0.1:5001:5000 training/webapp python app.py

查看容器的端口映射

docker port bf08b7f2cd89    #bf08b7f2cd89    为容器id

查看容器日志

docker logs

修改容器的端口映射
1:删除原有容器,重新建新容器

docker run -p 3306:3306 --name sixdu-mysql -v /root/server_v4/env/etc/mysql:/etc/mysql -v /root/server_v4/env/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.6.35

2:利用docker commit新构镜像
docker commit:把一个容器的文件改动和配置信息commit到一个新的镜像。这个在测试的时候会非常有用,把容器所有的文件改动和配置信息导入成一个新的docker镜像,然后用这个新的镜像重起一个容器,这对之前的容器不会有任何影响。

1、停止docker容器
docker stop container01
2、commit该docker容器
docker commit container01 new_image:tag
3、用前一步新生成的镜像重新起一个容器
docker run --name container02 -p 80:80 new_image:tag

连接容器
运行一个容器并连接到新建的 test-net 网络:

$ docker run -itd --name test1 --network test-net ubuntu /bin/bash

打开新的终端,再运行一个容器并加入到 test-net 网络:

$ docker run -itd --name test2 --network test-net ubuntu /bin/bash

下面通过 ping 来证明 test1 容器和 test2 容器建立了互联关系。

设置DNS
如果只想在指定的容器设置 DNS,则可以使用以下命令:

$ docker run -it --rm host_ubuntu  --dns=114.114.114.114 --dns-search=test.com ubuntu

参数说明:

-h HOSTNAME 或者 --hostname=HOSTNAME: 设定容器的主机名,它会被写到容器内的 /etc/hostname 和 /etc/hosts。

–dns=IP_ADDRESS: 添加 DNS 服务器到容器的 /etc/resolv.conf 中,让容器用这个服务器来解析所有不在 /etc/hosts 中的主机名。

–dns-search=DOMAIN: 设定容器的搜索域,当设定搜索域为 .example.com 时,在搜索一个名为 host 的主机时,DNS 不仅搜索 host,还会搜索 host.example.com。

仓库

仓库(Repository)是集中存放镜像的地方。

云仓库

$ docker login
$ docker logout

推送镜像
用户登录后,可以通过 docker push 命令将自己的镜像推送到 Docker Hub。
以下命令中的 username 请替换为你的 Docker 账号用户名。

$ docker tag ubuntu:18.04 username/ubuntu:18.04
$ docker image ls

REPOSITORY      TAG        IMAGE ID            CREATED           ...  
ubuntu          18.04      275d79972a86        6 days ago        ...  
username/ubuntu 18.04      275d79972a86        6 days ago        ...  
$ docker push username/ubuntu:18.04
$ docker search username/ubuntu

NAME             DESCRIPTION       STARS         OFFICIAL    AUTOMATED
username/ubuntu

本地仓库的使用:

1.先拉取registry镜像(用来启动仓库)和busybox镜像(用来上传)

docker pull registry
docker pull busybox

2.使用docker tag命令将这个镜像标记为192.168.2.189:5000/busybox

docker tag IMAGR[:TAG] NAME[:TAG]
docker tag docker.io/busybox 192.168.2.189:5000

3.修改docker配置文件,增加参数 --insecure-registry=192.168.2.189:5000
此处的参数指定为非安全模式,也就是http而不是https,然后重启docker服务。
在这里插入图片描述
4.创建registry容器并启动

docker run -d -p 5000:5000 --privileged=true -v /myregistry:/var/lib/registry registry

–privileged=true :CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)错误
-v选项指定将/myregistry/目录挂载给/var/lib/registry/,/tmp/registry是registry版本1的仓库目录。
/myregistry为本地创建的目录。

5.把本地标记的镜像push到仓库

docker push 192.168.2.189:5000/busybox
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值