标签:hub data 手动 str hosts 基本使用 访问控制 ups min
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
为例进行介绍。
对于使用 upstart 的系统而言,编辑 /etc/default/docker
文件,在其中的 DOCKER_OPTS
中配置加速器地址:
DOCKER_OPTS="--registry-mirror=https://registry.docker-cn.com"
重新启动服务。
$ sudo service docker restart
对于使用 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 search LAMP
--filter=stars=N
参数可以指定仅显示收藏数量为 N
以上的镜像。
获取镜像
从 Docker 镜像仓库获取镜像的命令是 docker pull
。其命令格式为:
docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签]
$ docker pull ubuntu:16.04
具体的选项可以通过 docker pull --help 命令看到,这里我们说一下镜像名称的格式。
镜像运行
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态(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 # 交互式进入后台镜像
root@3729b97e8226:/# echo ‘<h1>Hello, Docker!</h1>‘ > /usr/share/nginx/html/index.html
root@3729b97e8226:/# exit # 并不会删除容器的进程
exit
$ docker diff webserver # 查看对镜像做出的改动
# 现在我们定制好了变化,我们希望能将其保存下来形成镜像
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] # 保存现场
$ docker commit --author "Tao Wang <twang2218@gmail.com>" --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容器
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -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.
注意:
docker inspect
可以获取所有的变量,Docker 还可以有一个可变的网络配置。)-p
标记可以多次使用来绑定多个端口例如
$ docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
下面先创建一个新的 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;
root@3e5424b63b00:/var/www/html# mysql -uroot -pThonsun123@
3.apache2的使用在Ubuntu14.04下:service apache2 start|retstart|status,刚开的容器是没有开启apache2服务的,要手动开启,否则主机访问不了它的网站,
Apache的配置文档的修改很重要,一些安全措施
4.https://hub.docker.com/r/linode/lamp/ 这个镜像的官方文档
5.
root@kali:/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
root@kali:/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
root@kali:/home/kali#
# 现在我们定制好了变化,我们希望能将其保存下来形成镜像
docker commit [选项] <容器ID或容器名> [<仓库名>[:<标签>]] # 保存现场
$ docker commit --author "Tao Wang <twang2218@gmail.com>" --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
域控与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:\Windows\system32\drivers\etc\hosts.
基于不同端口的映射不同网站映射(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 webmaster@example.com
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 webmaster@example.com
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
Thonsun123@
thonsun123@
对于使用 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 # 复制文件
标签:hub data 手动 str hosts 基本使用 访问控制 ups min
原文地址:https://www.cnblogs.com/0xthonsun/p/9876107.html