Docker 基本操作

早先学习一些集群知识, 都是用虚拟机, 后来又用了 vagrant, 都相当耗资源,直到遇见了 docker ……

安装

安装Docker维护的版本

1
curl -sSL https://get.docker.com | sudo
1
2
3
4
5
6
7
8
9
10
11
12
If you would like to use Docker as a non-root user, you should now consider
adding your user to the "docker" group with something like:

sudo usermod -aG docker your-user

or:

sudo groupadd docker
sudo gpasswd -a ${USER} docker
sudo service docker restart

需要注销重新登录

容器操作

启动一个容器

1
2
3
4
5

docker run -i -t IMAGE [COMMAND] [ARG...]

-i interactive=true | false 默认是 false
-t --tty = true | false 默认是false 开启一个终端

启动一个守护式容器

1
2
3
4
5
6
7
8
9
# 1.先启动一个交互式容器,然后按下 Ctrl+P Ctrl+Q
docker run -i -t IMAGE /bin/bash

# 2. 直接启动守护式容器(推荐)
docker run -d 镜像名 [command] [arg...]

-d 表示后台执行容器中的命令,执行完后会容器会退出转为stop状态
如果想保持容器一直运行,就需要保持容器中前台有一个程序一直运行,比如 top,tail等等
docker run --name=zj -d [image] /bin/sh -c "while true; do echo hello > /dev/null; sleep 10; done"\

附加到运行中的容器

1
docker attach 容器名

查看容器

1
2
3
4
5
6
docker ps [-a] [-l]
无选项 查看正在运行的容器
-a 查看所有的容器
-l 查看最近的容器

docker inspect [容器的id或者容器的名字]

自定义容器名

1
docker run --name=自定义名 -i -t IMAGE /bin/bash

重新启动停止的容器

1
docker start [-i] 容器名

删除已经停止的容器

1
docker rm 容器名

查看容器日志

1
2
3
4
docker logs [-f] [-t] [--tail] 容器名
-f --follows=true | false 默认为false 一直跟踪日志的变化并返回结果
-t --timstamps=true | false 默认为false 返回的结果前加上时间戳
--tail="all" 不指定则返回所有的日志

查看容器内的进程

1
docker top 容器名

在运行中的容器中启动新进程

1
2
3
4
docker exec [-d] [-i] [-t] 容器名 [command] [arg...]
-d
-i
-t

停止守护式容器

1
2
3
docker stop 容器名 (发送一个kil命令,等待停止)

docker kill 容器名 (快速结束容器,不等待)

删除所有容器

1
docker rm $(docker ps -aq)

自定义 hostname 和 hosts

1
2
# 运行容器时 加 -h [hostname] , 加 --add-host=[host:ip]
docker run --name=cdh-4 -h chd-04 --add-host=cdh-04:172.17.0.5 waterandair/centos7-ssh /usr/sbin/sshd -D

镜像操作

列出镜像

1
2
3
4
5
docker images [OPTIONS] [REPOSITORY]
-a, --all=false 显示所有镜像 默认不显示中间层镜像
-f, --filter=[] 显示时的过滤条件
--no-trunc=false 不使用截断的形式显示数据
-q, --quiet=false 只显示镜像id

查看镜像详细信息

1
docker inspect [OPTIONS] CONTAINER | IMAGE [CONTAINER | IMAGE]

删除镜像

1
2
3
4
5
6
7
8
9
10
docker rmi [OPTIONS] IMAGE [IMAGE...]
-f, --force=false Force removal of the image
--no-prune=false Do not delete untagged parents

eg.

docker rmi ubuntu:14.04

# 删除resository 为 ubuntu 的所有镜像
docke rmi $(docker images -q ubuntu)

查找镜像

镜像地址 docker hub: https://registry.hub.docker.com
1
2
3
4
docker search [OPTIONS] TERM
-automated=false Only slow automated builds
--no-trunc=false Don't truncate output
-s, --stars=0 Only displays with at least [num] stars

拉取镜像

1
2
3
4
5
6
7
docker pull [OPTIONS] NAME [:TAG]
-a, --all-tags=false Download all tagged images in the repository

修改获取镜像地址:
使用 --registy-mirror 选项
1. 修改: /etc/default/docker
2. 添加: DOCKER_OPTS= "--registy-mirror=https://www.daocloud.io"

构建镜象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
docker commit     通过容器构建
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
-a, --author="" Author
-m, --message="" Commit message
-p, --pause=true Pause container during commit


docker build 通过 Dockerfile 文件构建
docker build [OPTIONS] PATH
--force-rm=false
--no-cache=false 不使用缓存
--pull=false
-q, --quiet=false
--rm=true
-t, --tag=""

创建一个Dockerfile
# First Dockerfile
FROM ubuntu:14.04
MAINTAINER zj "zj@zj.com"
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80

查看镜像构建的过程

1
docker history [image]

提交自己的镜像到 docker hub

1
docker push username/imagename[:tag]

修改镜像的tag

1
docker tag username/imagename[:tag]  username/imagename[:tag]

Docker 容器网络

http://www.atjiang.com/docker-single-host-network-exposure/

网桥

网桥是基于OSI七层模型中的数据链路层的
特点:

  • 可以设置IP地址
  • 相当于拥有一个隐藏的虚拟网卡
1
2
3
4
5
docker0 默认的地址划分

IP: 172.17.42.1 子网掩码: 255.255.0.0
MAC: 02:42:AC:11:00:00 到 02:42:ac:11:ff:ff
总共提供了 65534 个地址

网桥管理工具:

1
sudo apt-get install bridge-utils  && brctl show

修改docker0 地址:

1
sudo ifconfig docker0 192.168.200.1 netmask 255.255.255.0

添加虚拟网桥:

1
2
3
4
5
6
7
sudo brctl addbr br0
sudo ifconfig br0 192.168.100.1 netmask 255.255.255.0

# 更改 docker 守护进程的启动配置

/etc/default/docker 中添加 DOCKER_OPS 值
-b = br0

启动容器关于网络的选项

1
2
3
4
5
6
--link 给容器设置一个host别名
docker run --link=[CONTAINER_NAME]:[ALIAS] [IMAGE] [COMMOND]

--icc=false 拒绝所有容器间互联
--iptables=true 添加防火墙
--ip-forward=true # sysctl net.ipv4.conf.all.forwarding

获取容器的ip地址

1
2
3
4
5
6
7
docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

获取 ip hostname
docker inspect --format='{{.NetworkSettings.IPAddress}} {{.Config.Hostname}}' app1

获取容器ip 和对应的 name
docker inspect --format='{{.NetworkSettings.IPAddress}} {{index (split .Name "/") 1}}' $(docker ps -aq)

数据卷

数据卷的特点

  • 数据卷再容器启动时初始化,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中
  • 数据卷可以再容器之间共享和重用
  • 可以对数据卷里的内容直接进行修改
  • 数据卷的变化不会影响镜像的更新
  • 卷会一直存在,即使挂载数据卷的容器已经被删除

为容器添加数据卷

1
2
这是命令行的方式,docker 更推荐使用 数据卷容器 的方法
sudo docker run -v ~/local_data:/container_data -it ubuntu /bin/bash

为数据卷添加访问权限

1
sudo docker run -v ~/datavolume:/data:ro -it ubuntu /bin/bash

使用 dockerfile 构建包含数据卷的镜像

1
VOLUME ["/data"]

挂载数据卷容器

命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据卷的容器,就叫做数据卷容器。

1
2
docker run --volumes-form [CONTAINER NAME]
数据卷容器仅仅起传递配置的作用

文章标题:Docker 基本操作

文章字数:1.6k

本文作者:Waterandair

发布时间:2017-10-03, 23:38:00

最后更新:2019-12-28, 14:03:59

原始链接:https://waterandair.github.io/2017-10-03-docker-base-use.html

版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。

目录
×

喜欢就点赞,疼爱就打赏

github