docker基本操作
Posted 0xthonsun
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker基本操作相关的知识,希望对你有一定的参考价值。
docker的基本操作链接
docker安装
apt-get remove docker docker-engine docker.io # 旧版本卸载
apt-get update
apt-get install linux-image-extra-$(uname -r) linux-image-extra-virtual # ubuntu14.04的可选内核安装16.04以上不用 存储层驱动安装
apt源使用https添加软件包与CA证书
$ sudo apt-get update $ sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
国内源docker
$ sudo add-apt-repository "deb [arch=amd64] https://mirrors.ustc.edu.cn/docker-ce/linux/ubuntu $(lsb_release -cs) stable"
更新 apt 软件包缓存,并安装
docker-ce
$ sudo apt-get update $ sudo apt-get install docker-ce
docker ce启动
$ sudo systemctl enable docker # 开机启动 $ sudo systemctl start docker $ sudo service docker start # ubuntu14启动命令
建立
docker
组:$ sudo groupadd docker
将当前用户加入
docker
组:$ sudo usermod -aG docker $USER
docker镜像获取:官网与配置国内镜像加速
我们以 Docker 官方加速器
https://registry.docker-cn.com
为例进行介绍。Ubuntu 14.04、Debian 7 Wheezy
对于使用 upstart 的系统而言,编辑
/etc/default/docker
文件,在其中的DOCKER_OPTS
中配置加速器地址:DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
重新启动服务。
$ sudo service docker restart
Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 systemd 的系统,请在
/etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件){ "registry-mirrors": [ "https://registry.docker-cn.com" ] }
之后重新启动服务。
$ sudo systemctl daemon-reload $ sudo systemctl restart docker
注意:如果您之前查看旧教程,修改了
docker.service
文件内容,请去掉您添加的内容(--registry-mirror=https://registry.docker-cn.com
),这里不再赘述。这个是我在QQ上下载的文件以国内阿里云为例不错的下载速度
docker基本使用
镜像查找
docker search LAMP
--filter=stars=N
参数可以指定仅显示收藏数量为N
以上的镜像。获取镜像
从 Docker 镜像仓库获取镜像的命令是
docker pull
。其命令格式为:docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] $ docker pull ubuntu:16.04
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
- Docker 镜像仓库地址:地址的格式一般是 <域名/IP>[:端口号]。默认地址是 Docker Hub。
- 仓库名:如之前所说,这里的仓库名是两段式名称,即 <用户名>/<软件名>。对于 Docker Hub,如果不给出用户名,则默认为library,也就是官方镜像。
镜像运行
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(
stopped
)的容器重新启动。可以利用
docker container start
命令,直接将一个已经终止的容器启动运行。可以利用
docker run --help
命令,直接将一个实例化一个镜像启动运行。(ctrl+p,ctrl+q切换到后台不是exit退出容器)可以利用
docker run -d --name name -p....
命令,守护进程启动终止状态的容器可以用
docker container ls -a
命令看到。j进入后台运行的容器
docker exec -it 69d1 bash
docker container stop
来终止一个运行中的容器$ docker run -it --rm ubuntu:16.04 bash # 在exit下推出会删除镜像运行的容器,保存在临时的存储层数据不可修复 $ docker image ls #列出已经下载的镜像 $ docker system df # 使用的实际大小 $ docker image rm [选项] <镜像1> [<镜像2> ...] # 镜像的删除,有untaged,delete,untaged不会删除镜像多层文件结构(因为如果有其他的后来commit的镜像引用的话)
命令会用
nginx
镜像启动一个容器,命名为webserver
,并且映射了 80 端口,这样我们可以用浏览器去访问这个nginx
服务器。$ docker run --name webserver -d -p 80:80 nginx # 后台运行镜像,容器为镜像+外部存储层,指定名称 $ docker exec -it webserver bash # 交互式进入后台镜像 [email protected]:/# echo ‘<h1>Hello, Docker!</h1>‘ > /usr/share/nginx/html/index.html [email protected]:/# exit # 并不会删除容器的进程 exit $ docker diff webserver # 查看对镜像做出的改动 # 现在我们定制好了变化,我们希望能将其保存下来形成镜像 docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] # 保存现场 $ docker commit --author "Tao Wang <[email protected]>" --message "修改了默认网页" webserver # 指定源容器模板 nginx:v2 # 指定保存名称 $ docker run --name web2 -d -p 81:80 nginx:v2
如果要导出本地某个容器,可以使用
docker export
命令。$ docker container ls -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 7691a814370e ubuntu:14.04 "/bin/bash" 36 hours ago Exited (0) 21 hours ago test $ docker export 7691a814370e > ubuntu.tar
可以使用
docker import
从容器快照文件中再导入为镜像,例如$ cat ubuntu.tar | docker import - test/ubuntu:v1.0 $ docker image ls REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB
保存镜像运行时的文件不再是临时存储层数据卷的使用
- 数据挂载
主机目录挂载
### 创建一个数据卷
$ docker volume create my-vol
查看所有的
数据卷
$ docker volume ls local my-vol
在主机里使用以下命令可以查看指定
数据卷
的信息$ docker volume inspect my-vol [ { "Driver": "local", "Labels": {}, "Mountpoint": "/var/lib/docker/volumes/my-vol/_data", "Name": "my-vol", "Options": {}, "Scope": "local" } ]
### 启动一个挂载数据卷的容器
在用
docker run
命令的时候,使用--mount
标记来将数据卷
挂载到容器里。在一次docker run
中可以挂载多个数据卷
。下面创建一个名为
web
的容器,并加载一个数据卷
到容器的/webapp
目录。$ docker run -d -P --name web # -v my-vol:/wepapp --mount source=my-vol,target=/webapp training/webapp python app.py
### 查看数据卷的具体信息
$ docker inspect web
### 删除数据卷
$ docker volume rm my-vol
### 挂载一个主机目录作为数据卷
使用
--mount
标记可以指定挂载一个本地主机的目录到容器中去。$ docker run -d -P --name web # -v /src/webapp:/opt/webapp --mount type=bind,source=/src/webapp,target=/opt/webapp training/webapp python app.py
上面的命令加载主机的
/src/webapp
目录到容器的/opt/webapp
目录。这个功能在进行测试的时候十分方便,比如用户可以放置一些程序到本地目录中,来查看容器是否正常工作。本地目录的路径必须是绝对路径,以前使用-v
参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用--mount
参数时如果本地目录不存在,Docker 会报错。Docker 挂载主机目录的默认权限是
读写
,用户也可以通过增加readonly
指定为只读
。$ docker run -d -P --name web # -v /src/webapp:/opt/webapp:ro --mount type=bind,source=/src/webapp,target=/opt/webapp,readonly training/webapp python app.py
加了
readonly
之后,就挂载为只读
了。如果你在容器内/opt/webapp
目录新建文件,会显示如下错误/opt/webapp # touch new.txt touch: new.txt: Read-only file system
docker网络使用
外部访问docker容器
- 映射所有接口地址(接口可以理解为ip,网卡这些)
- 映射到指定地址的指定端口
- 映射到指定地址的任意端口
- 查看映射端口配置
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过
-P
或-p
参数来指定端口映射。当使用
-P
标记时,Docker 会随机映射一个49000~49900
的端口到内部容器开放的网络端口。使用
docker container ls
可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。$ docker run -d -P training/webapp python app.py $ docker container ls -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp
-p
则可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器。支持的格式有ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
。映射所有接口地址
使用
hostPort:containerPort
格式本地的 5000 端口映射到容器的 5000 端口,可以执行$ docker run -d -p 5000:5000 training/webapp python app.py
此时默认会绑定本地所有接口上的所有地址。
映射到指定地址的指定端口
可以使用
ip:hostPort:containerPort
格式指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1$ docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
查看映射端口配置
使用
docker port
来查看当前映射的端口配置,也可以查看到绑定的地址$ docker port nostalgic_morse 5000 127.0.0.1:49155.
注意:
- 容器有自己的内部网络和 ip 地址(使用
docker inspect
可以获取所有的变量,Docker 还可以有一个可变的网络配置。) -p
标记可以多次使用来绑定多个端口
例如
$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
- 容器有自己的内部网络和 ip 地址(使用
docker容器之间的通信:容器互联
下面先创建一个新的 Docker 网络。(高级使用docker compose)
$ docker network create -d bridge my-net
-d
参数指定 Docker 网络类型,有bridge
overlay
。其中overlay
网络类型用于 Swarm mode,在本小节中你可以忽略它。运行一个容器并连接到新建的
my-net
网络$ docker run -it --rm --name busybox1 --network my-net busybox sh
打开新的终端,再运行一个容器并加入到
my-net
网络$ docker run -it --rm --name busybox2 --network my-net busybox sh
下面通过
ping
来证明busybox1
容器和busybox2
容器建立了互联关系。在
busybox1
容器输入以下命令/ # ping busybox2 PING busybox2 (172.19.0.3): 56 data bytes 64 bytes from 172.19.0.3: seq=0 ttl=64 time=0.072 ms 64 bytes from 172.19.0.3: seq=1 ttl=64 time=0.118 ms
配置全部容器的 DNS ,也可以在
/etc/docker/daemon.json
文件中增加以下内容来设置。{ "dns" : [ "114.114.114.114", "8.8.8.8" ] }
这样每次启动的容器 DNS 自动配置为
114.114.114.114
和8.8.8.8
。使用以下命令来证明其已经生效。容器访问控制
容器的访问控制,主要通过 Linux 上的
iptables
防火墙来进行管理和实现。iptables
是 Linux 上默认的防火墙软件,在大部分发行版中都自带。容器访问外部网络
容器要想访问外部网络,需要本地系统的转发支持。在Linux 系统中,检查转发是否打开。
$sysctl net.ipv4.ip_forward net.ipv4.ip_forward = 1
如果为 0,说明没有开启转发,则需要手动打开。
$sysctl -w net.ipv4.ip_forward=1
访问所有端口
当启动 Docker 服务时候,默认会添加一条转发策略到 iptables 的 FORWARD 链上。策略为通过(
ACCEPT
)还是禁止(DROP
)取决于配置--icc=true
(缺省值)还是--icc=false
。当然,如果手动指定--iptables=false
则不会添加iptables
规则。可见,默认情况下,不同容器之间是允许网络互通的。如果为了安全考虑,可以在
/etc/default/docker
文件中配置DOCKER_OPTS=--icc=false
来禁止它。
常用命令
docker run -dit ubuntu
docker run -dit -p 10000:80 -name web lamp #后台运行
docker container ls # 列出正在运行的容器
dokcer exec -it container_name bash # 交互式运行终端
docker container ls -a # 列出所有的容器
docker container stop container_name
docker container start container_name # 启动一个已经停止了的容器
docker container rm trusting_newton # 删除一个容器
# 绑定目录
$ docker run -d -P --name web # -v /src/webapp:/opt/webapp --mount type=bind,source=/src/webapp,target=/opt/webapp training/webapp python app.py
# 数据卷
docker volume create my-vol
docker volume rm my-vol
docker volume ls
$ docker run -d -P --name web # -v my-vol:/wepapp --mount source=my-vol,target=/webapp training/webapp python app.py
# 外部容器访问
docker run -d -P training/webapp python app.py # 随机
docker container ls -l # 看详细信息
docker run -d -p 5000:5000 training/webapp python app.py
docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
# 容器互联 网桥统一网段
docker network create -d bridge my-net
docker run -it --rm --name busybox1 --network my-net busybox sh
docker run -it --rm --name busybox2 --network my-net busybox sh
# 镜像管理
docker image ls
docker image re name|id
docker image rm 501
docker run -p 8000:8000 -it ctfd/ctfd`
docker inspect 5506de2b643b # 看信息
sudo docker run --name mysql -d --restart always -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 -v /docker/mysql_data:/var/lib/mysql mysql/mysql-server
# 没有映射的端口是不能够访问的 10000我修改的两个vitualHost
sudo docker run -p 80:80 -p 3306:3306 -v /your/path/www:/var/www -v /your/path/apache2.conf:/etc/apache2/apache2.conf -v /your/path/my.cnf:/etc/mysql/my.cnf -t -i linode/lamp /bin/bash
#解释:
docker run:运行一个container,如果后面要绑定宿主主机的0-1024端口需要使用sudo
-p port1:port2: 将宿主机的端口port1映射到容器中的port2
-v file1:file2: 将宿主机的文件路径挂载到容器中的文件路径
-t -i linode/lamp /bin/bash:使用linode/lamp生成容器,并打开shell
# 虚拟机遇到的问题
1.docker run -p 80:80 -p 10000:10000 --mount type=bind source=/var/tmp/docker/www,target=/var/www/html -dit --name test linode/lamp # 绑定本机的文件夹或者文件,没有映射的端口本机是不能够访问的
2.数据库的密码与密码修改
以初始化的密码登入MySQL:mysql -uroot -p
use mysql;
mysql -uroot -p
#密码:Admin2015
#修改root可远程登录:
mysql>use mysql;
mysql>update user set host = ‘%‘ where user = ‘root‘ and host=‘127.0.0.1‘;
#修改密码:
mysql>update user set password=password("your_password");
#刷新权限
FLUSH PRIVILEGES;
[email protected]:/var/www/html# mysql -uroot [email protected]
3.apache2的使用在Ubuntu14.04下:service apache2 start|retstart|status,刚开的容器是没有开启apache2服务的,要手动开启,否则主机访问不了它的网站,
Apache的配置文档的修改很重要,一些安全措施
4.https://hub.docker.com/r/linode/lamp/ 这个镜像的官方文档
5.
[email protected]:/home/kali# docker run -dit --mount type=bind,source=/var/tmp/docker/www/,target=/var/www/ -p 81:80 -p 10001:10000 --name ctf ctf:v1 bash
cd9101a6dc094c0cec7066d557336bb1ca8a0427abcaa75e075f8a01087dc0c6
[email protected]:/home/kali# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cd9101a6dc09 ctf:v1 "bash" 11 seconds ago Up 9 seconds 3306/tcp, 0.0.0.0:81->80/tcp, 0.0.0.0:10001->10000/tcp ctf
3e5424b63b00 linode/lamp "bash" 3 hours ago Up 3 hours 0.0.0.0:89->80/tcp, 0.0.0.0:10000->3306/tcp test
[email protected]:/home/kali#
# 现在我们定制好了变化,我们希望能将其保存下来形成镜像
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] # 保存现场
$ docker commit --author "Tao Wang <[email protected]>" --message "修改了默认网页" webserver # 指定源容器模板
nginx:v2 # 指定保存名称
$ docker run --name web2 -d -p 81:80 nginx:v2
docker run -dit -p 82:80 -p 83:81 --mount type=bind,source=/var/tmp/docker/www,target=/var/www --name ctf1 ctf:v1 bash
docker container ls
docker inspect name
参考Apache2配置文件使用
域控与DNS服务器
127.0.0.1 www.example.com 127.0.0.1 www.example.com # dns hosts文件修改 A hosts file will probably be located at /etc/hosts or C:Windowssystem32driversetchosts.
总结Apache2 VitualHost的配置
基于不同端口的映射不同网站映射(docker主机的端口映射)
1.linode:lamp镜像的使用参考文档是要到hub中查阅 mysql code Admin2015
2.修改过的镜像生成 docker commit --author "thonsun" --message "your note" container_name lamp:ctf
3.apache2.conf配置文档采用include机制把全局配置,文件访问控制,虚拟机主机加载进来,在此我主要通过修改
# domain: example.com
# public: /var/www/example.com/public_html
Listen 81
#Listen 80会报错,可能在全局变量那配置了
#这里实现的是基于不同端口的访问,基于域名+主机/etc/hosts文件的DNS重定向的修改配置
<VirtualHost 172.17.0.4:81>
# Admin email, Server Name (domain name), and any aliases
ServerAdmin [email protected]
ServerName www.example.com
ServerAlias example.com
# Index file and Document Root (where the public files are located)
DirectoryIndex index.html index.php
DocumentRoot /var/www/example.com/public_html
# Log file locations
LogLevel warn
ErrorLog /var/www/example.com/log/error.log
CustomLog /var/www/example.com/log/access.log combined
</VirtualHost>
<VirtualHost 172.17.0.4:80>
# Admin email, Server Name (domain name), and any aliases
ServerAdmin [email protected]
ServerName www.thonsun.com
ServerAlias thonsun.com
# Index file and Document Root (where the public files are located)
DirectoryIndex index.html index.php
DocumentRoot /var/www/html/
# Log file locations
LogLevel warn
ErrorLog /var/www/html/error.log
CustomLog /var/www/html/access.log combined
</VirtualHost>
参考:
https://httpd.apache.org/docs/2.4/en/vhosts/examples.html 重要
https://www.cnblogs.com/ylan2009/archive/2012/02/25/2368028.html
Ubuntu 16.04+、Debian 8+、CentOS 7
对于使用 systemd 的系统,请在 /etc/docker/daemon.json
中写入如下内容(如果文件不存在请新建该文件)
{
"registry-mirrors": [
"https://registry.docker-cn.com"
]
}
注意,一定要保证该文件符合 json 规范,否则 Docker 将不能启动。
之后重新启动服务。
$ sudo systemctl daemon-reload
$ sudo systemctl restart docker
docker tag ctf:v2 thonsun/lamp:16.04
docker image ls
docker push thonsun/lamp:16.04
$ docker cp file container-id:newfile # 复制文件
以上是关于docker基本操作的主要内容,如果未能解决你的问题,请参考以下文章