Docker实用指令和搭SSH服务的实战

简介: Docker实用指令和搭SSH服务的实战

Docker架构图

DockerFile常用指令

CMD 与 ENTRYPOINT 的区别

ENTRYPOINT 的目的和 CMD 一样,都是指定容器的启动程序及参数。

ENTRYPOINT 在运行时也可以通过 docker run 的参数 --entrypoint 来替代镜像中默认的ENTRYPOINT,通过 --entrypoint 传的必须是可执行的二进制程序, 即不会以sh -c 形式执行。

当指定了 ENTRYPOINT (exec格式)后,CMD 的含义就发生了改变,不再是直接运行的命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为:<ENTRYPOINT> "<CMD>"

http://cloud.51cto.com/art/201411/457338.htm

 

 

ADD和COPY 的区别

COPY <源路径>... <目标路径>

ADD 指令和 COPY 的格式和性质基本一致。但是在 COPY 基础上增加了一些功能。比如 <源路径> 可以是一个 URL

镜像中存在和当前需要拷贝或添加的文件夹同名的文件夹时,才能够拷贝或添加成功。

COPY指令不会做自动解压工作

原路径现在实测必须是DockFile目录下的相对路径

 

WORKDIR指令

用于指定容器的一个目录,容器启动时执行的命令会在该目录下执行,相当于设置了容器的工作目录

https://blog.csdn.net/yjk13703623757/article/details/79648381

 

ONBUILD指令

可以为镜像添加触发器。其参数是任意一个Dockerfile 指令。

该指令对利用该Dockerfile构建镜像(比如为A镜像)不会产生实质性影响。

但是当我们编写一个新的Dockerfile文件来基于A镜像构建一个镜像(比如为B镜像)时,这时构造A镜像的Dockerfile文件中的ONBUILD指令就生效了,在构建B镜像的过程中,首先会执行ONBUILD指令指定的指令,然后才会执行其它指令。

需要注意的是ONBUILD只能再构建子镜像中执行,对孙子镜像构建无效。

利用ONBUILD指令,实际上就是相当于创建一个模板镜像,需要在子镜像构建过程中执行的一些通用操作就可以在模板镜像对应的dockerfile文件中用ONBUILD指令指定。 从而减少dockerfile文件的重复内容编写。

 

VOLUME

使用 -v 来挂载一个主机上的目录到容器的目录

docker run -d -P --name web2 -v /src/webapp:/webapp training/webapp python app.py

容器内对 /webapp 的操作都会反映到主机上的 /src/webapp 目录内。只是,重新启动容器时,可以再次使用同样的方式来将 /src/webapp 目录挂载到新的容器内,这样就可以实现数据持久化的目标

 

Docker实用命令

重启docker服务

sudo service docker restart

查看docker的详细信息

docker info

 

查看镜像

docker images

搜寻镜像

docker search mysql

docker search tomcat

删除镜像

docker rmi imageid

 

给镜像重命名(之后要docker rmi repository:tag 删除imageid相同的另镜像)

docker tag imageid repository:tag

 

基于Dockerfile构建镜像

docker build -t 镜像的tag .

docker build -f  /path/to/a/Dockerfile .

ps:

小数点.其实就是将当前目录设置为上下文路径。

-f Dockerfile文件的位置

 

 

 

存出镜像到本地文件

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

从本地文件载入镜像

docker load --input ubuntu_14.01.tar

 

 

拉取镜像

docker pull ubuntu:16.04

docker pull tcbenkhard/centos6-jdk7 #Docker Hub 仓库下载一个Centos6并且安装了jdk7的镜像

docker pull dl.dockerpool.com:5000 ubuntu:16.04 #通过具体地址下载

docker pull  docker.io/tomcat

 

创建容器

docker create -it ubuntu:16.04

启动容器

docker start containId

 

创建并启动容器

-d: 在后端启动docker

-P:随机映射49000~49900到容器内部

-p:固定映射某个端口到容器内部

-t:进入终端

-i:获得一个交互式的连接,通过获取container的输入

-rm:容器一退出就删除

docker run -it docker.io/tcbenkhard/centos6-jdk7 /bin/bash

docker run -ti ubuntu:16.04 /bin/bash

联网启动

docker run -ti -p --expose 95 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash

docker run -ti -p 127.0.0.1:5000:5000 --name centos6 docker.io/tcbenkhard/centos6-jdk7 /bin/bash #映射指定地址的指定端口

 

查看本机所有容器

docker ps -a

进入容器

docker exec -ti containId /bin/bash

docker attach containId

 

获取 容器的所有日志

docker logs containId

 

查看容器的详细信息

docker inspect containId

 

使用镜像源创建一个指定镜像的标签

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

 

终止容器

docker stop containId

删除容器

docker rm -f containId

 

退出容器

Ctrl-D或者exit

 

封装镜像

docker commit containId sshd:v1

docker commit -m "this is a new iamges" -a "lzhcoder"

 

查看docker容器启动日志

dcoker logs containId

 

查看构建历史

docker history imageid

 

停止并且删除所有容器

docker stop $(docker ps -q) & docker rm $(docker ps -aq)

 

根据镜像名或id称删除容器

docker rm $(docker ps -a | awk '/imageid/ {print $1}')

 

想要删除untagged images,也就是那些id为<None>的image的话可以用

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

 

1.创建一个私有仓库

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry:2

-v 指定镜像上传目录为容器的/opt/data/registry 默认在容器的/tmp/registry

2.对已有镜像重新打tag

docker tag docker.io/ubuntu:16.04 192.168.199.4:5000/test:16.04

images[:tag] [registryhost][username/]name[:tag]

3上传镜像

 

搭建ssh服务的实战

一、centos6

1.centos6安装sshd

sshd

rpm -qa|grep -E "openssh"

yum install openssh*

https://blog.csdn.net/mengyoufengyu/article/details/72855524

遇到的问题:

1.1.File"/usr/bin/yum", line 29, in <module> File"/usr/share/yum-cli/yummain.py", line 276, in

就执行下面语句后再安装

cd /var/lib/rpm/

rm -i __db.*

rpm –rebuilddb

yum clean all

https://blog.csdn.net/a756041482/article/details/48215609

2启动sshd

sudo systemctl enable sshd sudo systemctl start sshd 或者 service sshd start

查看绑定端口

netstat -aunpt

显示用户所有终端下的进程

ps aux

遇到的问题

2.1Could not load host key: /etc/ssh/ssh_host_dsa_key

安装sshd之后执行

ssh-keygen -t rsa -b 2048 -f /etc/ssh/ssh_host_dsa_key

 

3封装为镜像,并且运行

docker commit containId sshd:v1

docker run -p 127.0.0.1:8089:22 -ti sshd:v1

 

4启动sshd

/usr/sbin/sshd -D &

二、ubunto

1基于docker commit命令创建

1.1.apt-get update

 

1.2.安装python3

apt-get install python3

 

1.3.尝试使用sshd命令,会发现容器中并没有安装此命令

sshd

 

1.4.尝试安装openssh-server

apt-get install -y openssh-server

 

1.5.要正常启动ssh服务,需要目录/var/run/sshd存在,手动创建他,并启动服务

mkdir -p /var/run/sshd

/usr/sbin/sshd -D &

 

1.6.此时查看容器的22端口(SSH服务默认监听的端口),已经处于监听状态

apt-get install net-tools

netstat -tunlp

 

1.7.修改SSH服务的安全登录配置,取消pam登陆限制

sed -ri 's/session required pam_loginuid.so/#session required pam_loginuid.so/g' /etc/pam.d/sshd

 

1.8.在root用户目录下创建.ssh目录,并复制需要登录的公钥信息

ssh-keygen -t rsa(客户端和服务端都执行一次)

cd root/.ssh

ls

显示id_rsa id_rsa.pub

把客户端的id_rsa.pub内容复制到服务端的id_rsa.pub

apt-get install vim

vi /root/.ssh/authorized_keys

 

1.9.创建自动启动SSH服务的可执行文件run.sh,并添加可执行权限:

vim /run.sh

chmod +x run.sh

run.sh的内容如下:

#!/bin/bash /usr/sbin/sshd -D &

1.10.保存镜像

sudo docker commit containId sshd:ubuntu

 

 

1.11.使用镜像,并添加端口映射(10022–>22),其中10022是宿主主机的端口,22是容器SSH服务监听端口

sudo docker run -it -d -p 10022:22 sshd/ubuntu:16.04 /run.sh

 

1.12.在客户端机通过ssh连接服务机10022端口:

ssh 192.168.199.4 -p 10022

或则

docker inspect containId

获取IPAddress

ssh IPAddress

 

2、使用Dockerfile创建

2.1.创建工作目录

mkdir -p sshd_ubuntu

2.2在其中创建Dockerfile和run.sh文件:

cd sshd_ubuntu/ && touch Dockerfile run.sh

 

2.3编写run.sh脚本和authorized_keys文件

vim run.sh cat run.sh

文件内容如下: #!/bin/bash /usr/sbin/sshd -D & cat /root/.ssh/id_rsa.pub > ./authorized_keys

 

2.3.编写Dockerfile

# cat Dockerfile

# 基础镜像信息

FROM ubuntu:14.04

 

# 维护者信息

MAINTAINER staryjie staryjie@163.com

 

# 更新apt缓存、安装ssh服务

RUN apt-get update && apt-get install -y openssh-server

RUN mkdir -p /var/run/sshd /root/.ssh

RUN sed -ri 's#session required pam_loginuid.so#session required pam_loginuid.so#g' /etc/pam.d/sshd

 

# 配置免密要和自启动脚本

ADD authorized_keys /root/.ssh/authorized_keys

ADD run.sh /run.sh

RUN chmod 755 /run.sh

 

# 暴露22端口

EXPOSE 22

 

# 设置脚本自启动

CMD ["/run.sh"]

 

2.4创建镜像

cd ~/sshd_ubuntu/ && docker build -t sshd:ubuntu2 .

 

2.5测试镜像,运行容器

docker run -it --name ssh_test -p 10122:22 sshd:ubuntu2 bash

 

参考文章

https://www.cnblogs.com/jsonhc/p/7767669.html

https://blog.csdn.net/qq626387/article/details/50506636

 


相关文章
|
9天前
|
Java 应用服务中间件 Linux
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
本文主要讲解了Docker的安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库以及Docker容器虚拟化与传统虚拟机比较。
184 7
【Docker容器化技术】docker安装与部署、常用命令、容器数据卷、应用部署实战、Dockerfile、服务编排docker-compose、私有仓库
|
15天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
53 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
7天前
|
安全 Linux Shell
ssh 远程控制服务
SSH(Secure Shell)是一种用于远程登录的安全协议,相比FTP和Telnet,它提供了更高的安全性,避免了明文传输带来的风险。要使用SSH远程管理Linux系统,需要配置sshd服务。本文介绍了如何克隆Linux服务器、修改网络配置,并通过SSH连接两台服务器,最后在目标服务器上创建一个日志文件。
22 4
|
19天前
|
负载均衡 应用服务中间件 网络安全
docker swarm添加更多的服务
【10月更文挑战第16天】
18 6
|
19天前
|
Docker 容器
docker swarm启动服务并连接到网络
【10月更文挑战第16天】
20 5
|
20天前
|
负载均衡 网络协议 关系型数据库
docker swarm 使用网络启动服务
【10月更文挑战第15天】
19 4
|
21天前
|
Docker 容器
docker swarm 在服务中使用网络
【10月更文挑战第14天】
17 2
|
1月前
|
网络安全 虚拟化 Docker
SSH后判断当前服务器是云主机、物理机、虚拟机、docker环境
结合上述方法,您可以对当前环境进行较为准确的判断。重要的是理解每种环境的特征,并通过系统的响应进行综合分析。如果在Docker容器内,通常会有明显的环境标志和受限的资源视图;而在云主机或虚拟机上,虽然它们也可能是虚拟化的,但通常提供更接近物理机的体验,且可通过硬件标识来识别虚拟化平台。物理机则直接反映硬件真实信息,较少有虚拟化痕迹。通过这些线索,您应该能够定位到您所处的环境类型。
25 2
|
1月前
|
安全 网络安全 数据安全/隐私保护
docker服务未启动
【10月更文挑战第2天】
54 3
|
1月前
|
Linux iOS开发 Docker
docker服务未启动
【10月更文挑战第3天】
61 1